如果有人可以帮助完成这项任务,我将非常感激。我希望用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
但我不知道如何统计行号。
答案 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