2016-06-21 621 views
0

我一直在編寫腳本,它將解析CSV文件並以指定的格式輸出。使用shell腳本解析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第一行後面是列名(來自文件的第一行),:和列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

您捕獲第1行中的字段以便重複使用('for(i = 4; i <= NF; i ++)name [i] = $ i;')。在其他行中,您可以使用'printf'來遍歷字段4..NF打印相關數據。 –

+0

這些參數來自哪裏?輸入樣本中不存在它們 – Aaron

+0

在輸出列中,必須省略2,3,5和7,然後在6之後將它與像(SampleInterval:900)這樣的參數名稱連接起來。你可以寫awk語句我想完整的,以便它可以更清楚 –

回答

0

您捕獲第1行中的字段以供重複使用。在其他線路,您遍歷領域6..NF打印相關數據:

awk -F',' 'NR == 1 { for (i = 6; i <= NF; i++) name[i] = $i 
        printf "%s, %s, %s\n", $1, $4, "Parameters"; next } 
      { for (i = 6; i <= NF; i++) printf "%s, %s, %s:%s\n", $1, $4, name[i], $i; }' 

未經測試的代碼。

+0

它在加入文件名awk命令後正常工作,輸出正常...感謝 –