Linux

根據兩列查找重複項,然後對另一列求和

  • May 21, 2021

我有一個看起來像這樣的文件,

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
$ 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

我假設您問題中的預期輸出是錯誤的,因為上面是每個第 4 列值的總和 $ 1 and $ 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

引用自:https://unix.stackexchange.com/questions/650672