我试图通过对特定字段求和来折叠具有相同名称的行。我还想检查另一个字段是否也具有不同的 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