行の部分ブロックで遺伝子値が一致しない行をフィルタリングしたいと思います。重複した一貫した値がある場合は、最初の行のみを保持します。たとえば、「gf345 part1」には複数の遺伝子値があるため、このブロックは削除され、「gf345 part3」には単一の遺伝子値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
答え1
最も簡単なのは、最初に入力をソートすることです。このソリューションは、処理できる入力ファイルのサイズを制限する配列の使用を防ぎます。
注文が問題にならない場合は、次のように動作します。
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
}'