遺伝子型を0/1に変換

遺伝子型を0/1に変換

次のファイルがあります。

1    rs6687776    1020428    T    C    T    C    T    C    C    C    T    C    C    C    T    C

4番目と5番目の列は2つの異なる可能性があります。対立遺伝子そのウェブサイトから。対立遺伝子が0存在するTか対立遺伝子が1あるかを示すには、列6を変更する必要がありますC。私のファイルは20805 x 459です。したがって、次のようにする必要があります。

1   rs6687776   1020428 T   C   0   1   0   1   1   1   0   1   1   1   0   1

私は試した:

cat file | while read line
do if [ [,6-] = [,4] ]
then
    echo "0"
    echo "1"
fi
done

しかし、私は長さ41610を減らし、交互に0構成されたファイルで終わりました。1おそらくAWKもっと便利ですか?

ベストアンサー1

別のアプローチは次のとおりですawk

$ awk '{a[$4]=0;a[$5]=1; for(i=6;i<=NF;i++){$i=a[$i]}}1;' file
1 rs6687776 1020428 T C 0 1 0 1 1 1 0 1 1 1 0 1

説明する

  • a[$4]=0;a[$5]=1;a$4:2つのキーを使って配列を作成します$5。の値$4はに設定され、0の値は$51に設定されます。
  • for(i=6;i<=NF;i++){$i=a[$i]}:6から最後までの各フィールド番号について、見つかったヌクレオチド配列に格納されている値にフィールドを設定します。

  • 1;:awk は「この行の印刷」の略です。


Perlを使用してこれを行うこともできます。

$ perl -lane 's/$F[3]/0/ for @F[5..$#F]; s/$F[4]/1/ for @F[5..$#F]; print "@F"' file
1 rs6687776 1020428 T C 0 1 0 1 1 1 0 1 1 1 0 1

同じ考えです。 makeは空白の各行を配列に分割するのが好き-aです。次に、4番目のフィールド(、配列は0から始まり)で見つかったヌクレオチドのすべてのケースをに置き換え、5番目のフィールド()のすべてのケースをに置き換えます。これは、置換がフィールド 6 から終了までのみ適用されることを意味します。最後に変更された配列を印刷します。perlawk@F$F[3]0$F[4]1for @F[5..$#F]

おすすめ記事