使用 shell 脚本解析 CSV 文件
Parsing a CSV file using shell scripting
我一直在尝试编写脚本来解析 CSV 文件并以指定格式提供输出。
输入文件格式如下。
collectionBeginTime,ID,MU,hostname,Granularity,SampleInterval,suspectFlag,memCpuUsage,memUsedMemory,memMemoryCapacity,memRequestNum,memOnlineUserNum,memUsedLogDisk,memLogDiskCapacity,freeCPUUsage,freeMemory,freeLogDisk
2015-11-27 17:30:00-0500,NE=2106384,hwMEMPerformanceCollect,PG_172.16.169.70,900,900,0,24,7130,36153,0,1554,23026,157239,76,29023,134213
2015-11-27 17:30:00-0500,NE=2106386,hwMEMPerformanceCollect,PG_172.16.169.68,900,900,0,4,7481,36153,0,1594,22778,157239,96,28672,134461
输出应采用以下格式(仅显示输入第一行的少数输出行):
collectionBeginTime , hostname , Parameters
2015-11-27 17:30:00-0500, PG_172.16.169.70, SampleInterval:900
2015-11-27 17:30:00-0500, PG_172.16.169.70, suspectFlag:0
我需要在第一行之后为每一行打印第 1 列和第 4 列,然后是列名(来自文件的第 1 行),:
和第 6..NF 列的列值(完全忽略第 2、3、5 列)。一条输入线生成多条输出线。
我写的脚本:
#!/bin/bash
FILENAME=
awk -F',' 'BEGIN{OFS=",";} { if ( NR!=1 )print ,,,,,,,,,,,,}' < $FILENAME >> tmp.txt
echo "completed"
脚本是 运行 但在同一行中显示所有参数但没有名称。我如何解决它?
您捕获第 1 行中的字段以供重复使用。在其他行中,您遍历字段 6..NF 打印相关数据:
awk -F',' 'NR == 1 { for (i = 6; i <= NF; i++) name[i] = $i
printf "%s, %s, %s\n", , , "Parameters"; next }
{ for (i = 6; i <= NF; i++) printf "%s, %s, %s:%s\n", , , name[i], $i; }'
未经测试的代码。
我一直在尝试编写脚本来解析 CSV 文件并以指定格式提供输出。
输入文件格式如下。
collectionBeginTime,ID,MU,hostname,Granularity,SampleInterval,suspectFlag,memCpuUsage,memUsedMemory,memMemoryCapacity,memRequestNum,memOnlineUserNum,memUsedLogDisk,memLogDiskCapacity,freeCPUUsage,freeMemory,freeLogDisk
2015-11-27 17:30:00-0500,NE=2106384,hwMEMPerformanceCollect,PG_172.16.169.70,900,900,0,24,7130,36153,0,1554,23026,157239,76,29023,134213
2015-11-27 17:30:00-0500,NE=2106386,hwMEMPerformanceCollect,PG_172.16.169.68,900,900,0,4,7481,36153,0,1594,22778,157239,96,28672,134461
输出应采用以下格式(仅显示输入第一行的少数输出行):
collectionBeginTime , hostname , Parameters
2015-11-27 17:30:00-0500, PG_172.16.169.70, SampleInterval:900
2015-11-27 17:30:00-0500, PG_172.16.169.70, suspectFlag:0
我需要在第一行之后为每一行打印第 1 列和第 4 列,然后是列名(来自文件的第 1 行),:
和第 6..NF 列的列值(完全忽略第 2、3、5 列)。一条输入线生成多条输出线。
我写的脚本:
#!/bin/bash
FILENAME=
awk -F',' 'BEGIN{OFS=",";} { if ( NR!=1 )print ,,,,,,,,,,,,}' < $FILENAME >> tmp.txt
echo "completed"
脚本是 运行 但在同一行中显示所有参数但没有名称。我如何解决它?
您捕获第 1 行中的字段以供重复使用。在其他行中,您遍历字段 6..NF 打印相关数据:
awk -F',' 'NR == 1 { for (i = 6; i <= NF; i++) name[i] = $i
printf "%s, %s, %s\n", , , "Parameters"; next }
{ for (i = 6; i <= NF; i++) printf "%s, %s, %s:%s\n", , , name[i], $i; }'
未经测试的代码。