使用 awk 基于 2 个不同字段对列求和



我试图通过对特定字段求和来折叠具有相同名称的行。我还想检查另一个字段是否也具有不同的 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?我更喜欢尴尬,但也欢迎其他解决方案!

您可以使用这个 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

相关内容

  • 没有找到相关文章