根据两列查找重复项,然后对另一列求和

根据两列查找重复项,然后对另一列求和

我有一个看起来像这样的文件,

 REF     QUERY   COVR    COVQ
sca_10_chr8_2_0 scaffold_2     0.08    2.48
sca_10_chr8_2_0 scaffold_1     0.02    0.02
sca_10_chr8_2_0 scaffold_2      0.22    0.06
sca_10_chr8_2_0 scaffold_2      0.21    0.05
sca_10_chr8_2_0 scaffold_1     0.21    0.27
sca_10_chr8_2_0 scaffold_2     0.21    0.64
sca_10_chr8_2_0 scaffold_4      0.20    0.06
sca_10_chr8_2_0 scaffold_8      0.20    0.07
sca_10_chr8_2_0 scaffold_10     0.21    0.08

对于第 1 列和第 2 列的每种不同组合,或基于第 1 列和第 2 列的重复项,我想对第 4 列(总覆盖率)进行求和,并得到如下输出文件:

REF QUERY COVQ
sca_10_chr8_2_0  scaffold_2  1.52
sca_10_chr8_2_0  scaffold_1  0.29
sca_10_chr8_2_0  scaffold_4  0.06
sca_10_chr8_2_0  scaffold_8  0.07
sca_10_chr8_2_0  scaffold_10  0.08

答案1

$ cat tst.awk
NR==1 { print $1, $2, $4; next }
{ sum[$1 OFS $2] += $4 }
END {
    for (key in sum) {
        print key, sum[key]
    }
}

$ awk -f tst.awk file
REF QUERY COVQ
sca_10_chr8_2_0 scaffold_8 0.07
sca_10_chr8_2_0 scaffold_10 0.08
sca_10_chr8_2_0 scaffold_1 0.29
sca_10_chr8_2_0 scaffold_2 3.23
sca_10_chr8_2_0 scaffold_4 0.06

我假设您问题中的预期输出是错误的,因为上面是每对 $1 和 $2 的第四列值的总和。

答案2

使用磨坊主:

$ mlr --pprint --ofmt '%.2f' stats1 -a sum -g REF,QUERY -f COVQ yourfile
REF             QUERY       COVQ_sum
sca_10_chr8_2_0 scaffold_2  3.23
sca_10_chr8_2_0 scaffold_1  0.29
sca_10_chr8_2_0 scaffold_4  0.06
sca_10_chr8_2_0 scaffold_8  0.07
sca_10_chr8_2_0 scaffold_10 0.08

相关内容