计算行与总结特定列

时间:2017-07-10 08:03:53

标签: awk

如果有人可以帮助完成这项任务,我将非常感激。我希望用awk做到这一点,但如果除了awk之外还有更好的策略,我也想知道。

这是虚弱的,

S,0,3118,*,0,*,*,*,10-2,c645,5
H,0,648,99.2,+,0,0,250I648M2220I,10-2,c4204,1
H,0,597,99.2,+,0,0,314I597M2207I,10-2,c4022,1 
S,1,2488,*,0,*,*,*,10-2,c17,4
H,1,798,97.4,+,0,0,1407I798M283I,10-2,c232,2
H,1,796,98,+,0,0,628I796M1064I,10-2,c67,1
H,1,751,97.5,-,0,0,668I144M3D290MD313M1073I,10-2,c115,1
H,1,792,98.4,+,0,0,628I792M1068I,10-2,c380,1
S,2,2437,*,0,*,*,*,10-2,c102,7
S,3,2218,*,0,*,*,*,10-2,c1081,10
H,3,928,99.2,-,0,0,3D925M1293I,10-2,c986,3

outfile我想要的是,

outfile

0,3,7
1,5,9
2,1,7
3,2,13

因此,如果infile的第二列相同,则计算行数(outfile的第二列)以及最后一列(outfile的第三列)的总和值。

我试过

awk -F',' '{a[$2] += $11}; END{for(c in a) print c, a[c]}' < infile

但我不知道如何统计行号。

1 个答案:

答案 0 :(得分:3)

简单Awk命令,具有在$2值上散列的逻辑。一次跟踪第二列值的出现次数,一次跟踪最后一个字段的总和。它就像

awk 'BEGIN{FS=OFS=","}{unique[$2]++; uniqueSum[$2]+=$NF}END{for (i in unique) print i,unique[i],uniqueSum[i]}' file

它将为您提供所需的输出。部分BEGIN{FS=OFS=","}负责将输入和输出字段分隔符设置为,,而{unique[$2]++; uniqueSum[$2]+=$NF}则用于散列$2中唯一ID值的计数及其总计值在最后一栏。在处理完所有行之后运行END子句。因此,我们打印唯一列,其计数和总和,以便根据需要获得输出。

0,3,7
1,5,9
2,1,7
3,2,13