Отфильтровать несогласованные блоки данных

Я хотел бы отфильтровать строки, которые имеют несогласованные значения geno в блоках отдельных частей. В случае повторяющихся согласованных значений я бы просто сохранил первую строку. Например, «gf345 part1» имеет более одного значения geno, поэтому удалите этот блок, «gf345 part3» повторяется с единственным значением geno AT, поэтому сохраняйте только первую строку.

line part serial geno ax211 part1 1234 AA gf345 part1 1345 TT gf345 part1 3456 AA gf345 part1 1346 TT ax211 part2 1834 AA gf345 part2 1395 TT gf345 part2 3656 AA gf345 part2 13746 TT ax211 part3 1634 AA gf345 part3 13345 AT gf345 part3 34256 AT gf345 part3 13446 AT 

Ожидаемые результаты

 line part serial geno ax211 part1 1234 AA ax211 part2 1834 AA ax211 part3 1634 AA gf345 part3 13345 AT 

это то, что я пробовал.

 awk 'FNR==NR {a[$1$2]+=$4; b[$1$2]=$4;next} $1$2 in b {if (a[$1$2] ==1 ) print $0 } ' file file 

Я считаю, что проще всего сначала отсортировать входные данные. Это решение позволяет избежать использования массива, который ограничивает размер входного файла, который вы можете обрабатывать.

Если сортировка не является проблемой, тогда это должно работать:

 sort file | awk '{ if ($1$2 != key) { if (valid == 1) print firstline; firstline=$0; key=$1$2; value=$4; valid=1 } else { if ($4 != value) valid = 0 } } END { if (valid == 1) print firstline }'