Предполагая, что вы имеете в виду <=
вместо <
, поскольку 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
и ожидаемый результат, который вы предоставили.
$ 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.
Использование Миллера:
$ 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