【问题标题】:Multiple awk output to csv columns多个 awk 输出到 csv 列
【发布时间】:2014-08-08 14:33:25
【问题描述】:

我有许多独立运行的命令。以下 5 个 awk 命令当前输出所需的数据,以逗号分隔。我想将以下所有 awk 输出组合在一起,以便将它们呈现在一个 csv 文件中,但我运气不佳。

以下命令只是搜索包含特定单词的行,并提取必填字段的输出。例如.. 我希望第一个命令的 $4,$5,$6,$7,$8,$9 填充前 6 列,然后在接下来的 2 列中从第二个命令输出 $2,$4。

awk '/start/ { print $4,$5,$6,$7,$8,$9 }' 07.08.2014.txt | sed -e "s/ /,/g"
awk '/PacketLoss/ { print $2,$4 }' 07.08.2014.txt | sed -e "s/ /,/g"
awk '/PacketOutOfSequence/ { print $2,$4,$6 }' 07.08.2014.txt | sed -e "s/ /,/g"
awk '/JitterSD/ { print $3,$6,$9 }' 07.08.2014.txt | sed -e "s/ /,/g"
awk '/NumOfRTT/ { print $2,$4,$6,$8 }' 07.08.2014.txt | sed -e "s/ /,/g" 

输入数据示例

Aggregation start time 11:45:47.893 BST Thu Aug 7 2014
NumOfRTT: 360000        RTTAvg: 145     RTTMin: 144     RTTMax: 171
PacketLossSD: 0 PacketLossDS: 0
PacketOutOfSequence: 3  PacketMIA: 0    PacketLateArrival: 0
Jitter Avg: 1   JitterSD Avg: 1 JitterDS Avg: 1

示例输出

11:45:47.893,BST,Thu,Aug,7,2014,0,0,3,0,0,1,1,1,360000,145,144,171

将每列标记如下也很好,但如果太复杂,这并不重要,因为我可以手动完成

START_TIME,BST,DAY,MONTH,DATE,YEAR,PacketLossSD,PacketLossDS,PacketOutOfSeq,PacketMIA,PacketLateArrival,JitterAvg,JitterSD_Avg,JitterSD_Avg,NumOfRTT,RTTAvg,RTTMin,RTTMax
11:45:47.893,BST,Thu,Aug,7,2014,0,0,3,0,0,1,1,1,360000,145,144,171

提前感谢您的帮助:)

【问题讨论】:

  • 您的输出与您的输入不匹配。而且您的列标签也不匹配。 (您的 PacketLossSD 为 2。)
  • 很好发现..我有正确的..谢谢

标签: csv awk


【解决方案1】:
awk '
  NR==1 { print "START_TIME,BST,DAY,MONTH,DATE,YEAR,PacketLossSD,PacketLossDS,PacketOutOfSeq,PacketMIA,PacketLateArrival,JitterAvg,JitterSD_Avg,JitterSD_Avg,NumOfRTT,RTTAvg,RTTMin,RTTMax" }
  /start/               { tm = sprintf("%s,%s,%s,%s,%s,%s",$4,$5,$6,$7,$8,$9) }
  /PacketLoss/          { pl  = sprintf("%s,%s",$2,$4) }
  /PacketOutOfSequence/ { pos = sprintf("%s,%s,%s",$2,$4,$6) }
  /NumOfRTT/            { rtt = sprintf("%s,%s,%s,%s",$2,$4,$6,$8) }
  /JitterSD/            { printf("%s,%s,%s,%s,%s,%s,%s\n",tm,pl,pos,$3,$6,$9,rtt) }
' 07.08.2014.txt

这个想法是在读取行时将数据保存在字符串中,并且仅在读取最后一行(假设是包含“JitterSD”的行)时将其打印出来。

另一种想法:

awk '
  BEGIN { RS=""; FS="\n"; OFS="," }
  {
    split($1,a," "); L1=a[4]","a[5]","a[6]","a[7]","a[8]","a[9]
    split($2,a," "); L2=a[2]","a[4]","a[6]","a[8]
    split($3,a," "); L3=a[2]","a[4]
    split($4,a," "); L4=a[2]","a[4]","a[6]
    split($5,a," "); L5=a[3]","a[6]","a[9]
    print L1, L3, L4, L5, L2
  }
' 07.08.2014.txt

RS="" 是一种特殊设置,可将记录拆分为一个或多个空行,用于多行记录。

FS="\n" 会将$1$2 等设置为多行记录的第 1 行、第 2 行等。

split($1,a," ") 将行拆分为由空格分隔的字段,并将它们放入数组 a

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多