使用awk基于2个不同字段汇总列

时间:2016-06-03 22:23:26

标签: bash awk merge

我试图通过对特定字段求和来折叠具有相同名称的行。我还想检查另一个字段是否也有不同的ID。例如, 我的文件看起来像这样:

F1  F2  F3  F4  F5
1   A_1 1   B_1 4
2   A_1 2   B_1 5
3   A_2 4   B_1 2
4   A_3 3   B_2 4
5   A_3 2   B_2 2
6   A_3 1   B_2 1
7   A_4 2   B_2 2

我想检查F4值和F2值,将F5和F3相加如下:

1   A_1 3   B_1 9
3   A_2 4   B_1 2
6   A_3 6   B_2 7
7   A_4 2   B_2 2
到目前为止,我已经尝试过了:

awk 'BEGIN{OFS=FS="\t"}FNR==NR{a[$4]+=$5;next}; {print $0,a[$4]}' \ 
dummy.txt dummy.txt |sort -k 4,4 -u

给了我:

1       A_1     1       B_1     4       11
4       A_3     3       B_2     4       9

如何修改它以便在合并之前考虑F2呢?我更喜欢awk,但也欢迎其他解决方案!

1 个答案:

答案 0 :(得分:2)

您可以使用此gnu awk命令:

awk 'BEGIN {
   FS=OFS="\t"
   PROCINFO["sorted_in"] = "@ind_num_asc"
}
{
   k=$2 SUBSEP $4
}
!(k in c1) {
   c1[k]=$1
   c2[k]=$2
   c4[k]=$4
}
{
   s3[k]+=$3
   s5[k]+=$5
} 
END {
   for (i in s3)
      print c1[i], c2[i], s3[i], c4[i], s5[i]
}' file

1   A_1 3   B_1 9
3   A_2 4   B_1 2
4   A_3 6   B_2 7
7   A_4 2   B_2 2