繁体   English   中英

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

[英]Sum columns based on 2 different fields using awk

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM