一貫性のないデータブロックのフィルタリング

一貫性のないデータブロックのフィルタリング

行の部分ブロックで遺伝子値が一致しない行をフィルタリングしたいと思います。重複した一貫した値がある場合は、最初の行のみを保持します。たとえば、「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
}'

おすすめ記事