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