【发布时间】:2016-06-21 18:31:45
【问题描述】:
我一直在尝试编写将解析 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=$1
awk -F',' 'BEGIN{OFS=",";} { if ( NR!=1 )print $1,$4,$6,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17}' < $FILENAME >> tmp.txt
echo "completed"
脚本正在运行,但在同一行显示所有参数,但不显示其名称。我如何解决它?
【问题讨论】:
-
您捕获第 1 行中的字段以供重复使用 (
for (i = 4; i <= NF; i++) name[i] = $i;)。在其他行中,您遍历字段 4..NF 打印相关数据,可能使用printf。 -
这些参数从何而来?您的输入样本中没有它们
-
在输出列中,必须省略第 2、3、5 和 7 列,然后从第 6 列开始将其与参数名称连接起来,例如 (SampleInterval:900)。能否请您完整地写下我认为的 awk 语句,以便更清楚
-
@Aaron:它们在那里:第 6..NF 列包含值,第 1 行(字段 6..NF)中的条目包含参数名称。不明显,我承认,但信息就在那里。
-
没关系,我有一个漂亮的单行代码
cut+column但它不会适合那个用例。
标签: bash csv fileparsing