如何在unix shell脚本中通过awk旋转数据?

如何在unix shell脚本中通过awk旋转数据?

我正在尝试使用 awk 来旋转文件。这是我的输入文件的示例:

P2P,P2P,MP,DL,AIR,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2
P2P,P2P,MP,DL,AI,UP,HR,UPE,GSM,F,PP,4,NA,0.2,0.8
P2P,P2P,MP,DL,AIR,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2
P2P,P2P,MP,DL,AI,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2
P2P,P2P,MP,DL,AIR,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2
P2P,P2P,MP,DL,AIR,UP,HR,UPE,GSM,F,PP,1,NA,0.2,0.2
P2P,P2P,MP,DL,BIR,UP,HR,UPE,GSM,S,PP,10,NA,0.2,2
P2P,P2P,MP,KT,AIR,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2
P2P,P2P,MP,MM,AIR,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2

所需的输出应如下。

AIR,5,1  
AI,1,0.2  
BIR,10,2
  • 这里第一个字段属于$5.
  • 第二个字段属于$12(总计$12)。
  • 第三个字段属于$15(总计$15)。

条件应符合以下条件awk

$3=="MP" && $10=="S" && $5!="MP"

答案1

awk

awk -F, '$3=="MP"&&$10=="S"&&$5!="MP"{a[$5]+=$12;b[$5]+=$15}
  END{for(i in a){print i","a[i]","b[i]}}' file

  • -F,将分隔符设置为,.
  • $3=="MP"&&$10=="S"&&$5!="MP"{...}这是问题的条件
    • a[$5]+=$12;b[$5]+=$15a用 的总值填充一个数组,并用 的总值填充$12一个数组。b$15
  • END{...}该块在awk处理完所有行后运行。
    • for(i in a)循环遍历a数组
    • print i","a[i]","b[i]}打印两个数组中的值及其索引。

输出:

AI,1,0.2
AIR,5,1
BIR,10,2

答案2

使用 awk 进行过滤和GNU 数据整合对于旋转你可以这样做:

$ awk -F, '$3=="MP" && $10=="S" && $5!="MP"' FILE.TXT \
     | datamash --sort -t, --group 5 sum 12 sum 15
AI,1,0.2
AIR,5,1
BIR,10,2

相关内容