Поиск дубликатов на основе двух столбцов, а затем суммирование другого столбца

Предполагая, что вы имеете в виду <=вместо <, поскольку 1<1<12— это , а неYES:

$ cat tst.awk
NR==FNR {
    cnt[$2]++
    beg[$2,cnt[$2]] = $3
    end[$2,cnt[$2]] = $4
    next
}
{
    out = ""
    for (i=2; i<=NF; i++) {
        split($i,parts,/:/)
        key = parts[1]
        for (j=1; j<=cnt[key]; j++) {
            if ( (beg[key,j] <= parts[2]) && (parts[2] <= end[key,j]) ) {
                out = out OFS $i
                break
            }
        }
    }
    if ( out != "" ) {
        print ++outNr out
    }
}

$ awk -f tst.awk file2 file1
1 21:23
2 14:1 14:60

Приведенное выше было протестировано с использованием двух предоставленных вами входных файлов:

$ tail file1 file2
==> file1 <==
1 21:10 21:23
2 1:94 1:100 1:123
3 14:1 14:60 14:23

==> file2 <==
a 21 20 60
b 2 80 90
c 14 50 100
d 2 10 20
e 14 1 12

и ожидаемый результат, который вы предоставили.

0
21.05.2021, 10:53
2 ответа
$ 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 и $2.

3
28.07.2021, 11:30

Использование Миллера:

$ 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
2
28.07.2021, 11:30

Теги

Похожие вопросы