複数列のマッチングと調整に awk を使用する

複数列のマッチングと調整に awk を使用する

次のファイルがあります

    ID A1 A2 A3
    1  A  G  A
    2  T  G  A
    3  T  A  G
    4  T  G  A
    5  A  A  G
    6  A  C  A
    7  C  T  G

数千行の長さで、G、C、T、Aで構成されています。ここで、GはCを補完し、AはTを補完します。私がしたいのは、A2またはA3でA1と一致するものを検索することです。一致するものがある場合はそのままにし、そうでない場合はA2とA3を補完項目(A = T、G = Cなど)に変更し、その逆も同様です。

したがって、出力は次のようになります。

    ID A1 A2 A3
    1  A  G  A
    2  T  C  T
    3  T  T  C
    4  T  C  T
    5  A  A  G
    6  A  C  A
    7  C  A  C

awkを使用して、一致するIDと一致しないIDをフィルタリングできると思いました。

   awk '{if($2 != $3 || $2 != $4) print $0}' mergedlist > nonmatchlist

そして

   awk '{if($2 == $3 || $2 == $4) print $0}' mergedlist > matchlist

ただし、これは1つの変数(前者の場合はT、後者の場合はA)にのみ機能します。

ベストアンサー1

perl -lane 'sub flip { if ($_[0] eq "T") { "A" } elsif ($_[0] eq "A") { "T" } elsif ($_[0] eq "G") { "C" } elsif ($_[0] eq "C") { "G" } else { $_[0] } } if (!($F[1] eq $F[2] or $F[1] eq $F[3])) { $F[2] = flip($F[2]); $F[3] = flip($F[3]) } print "@F"' < input

実際には素晴らしい仕事をしないので、ポートバックするのは簡単ですが、awk見つけるのに時間がかかります。

おすすめ記事