Использование GNU datamash
, tr
и awk
при условии, что ввод и вывод разделены табуляцией:
$ datamash -s -g1,2,3,4 collapse 5 < file | tr ',' '\t' | awk 'NF==7'
chr3 4 T A sample1 sample2 sample3
Сначала используйте datamash
для сортировки входного файла, сгруппируйте по первые четыре поля и сверните значения (через запятую) в 5-м поле. Результат будет выглядеть так:
$ datamash -s -g1,2,3,4 collapse 5 < file
chr1 1 A T sample1,sample2,sample3,sample4
chr1 3 G C sample1
chr2 1 G C sample1
chr2 2 G C sample3,sample4
chr2 2 T A sample1
chr2 3 T A sample2
chr3 4 T A sample1,sample2,sample3
chr5 1 A T sample4
chr5 2 G C sample4
Затем направьте вывод в tr
, чтобы преобразовать запятые в табуляции, и, наконец, используйте awk
для печати строк с семью полями.
Использование awk
:
awk '
BEGIN{ FS=OFS="\t" }
{
idx=$1 FS $2 FS $3 FS $4
cnt[idx]++
data[idx]=(cnt[idx]==1 ? "" : data[idx] OFS) $5
}
END{
for (i in cnt)
if (cnt[i]==3) print i, data[i]
}
' file
Поддерживать два массива, используя первые четыре поля в качестве индекса.
Первый увеличивает счетчик всякий раз, когда встречается запись с тем же индексом, а второй добавляет 5-е поле с использованием табуляции в качестве разделителя.
В конечном блоке l oop поверх массива cnt
и вывести индекс и значение массива data
, если количество равно трем.