遺伝子型を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]

答え2

次のことを試すことができますawk

awk '{ for (i = 6; i <= NF; i++) { if ($i == $4) { $i = 0; } else if ($i == $5) { $i = 1; } } } 1' file

または:

awk '{ for (i = 6; i <= NF; i++) { $i = ($i == $4) ? 0 : 1; } } 1' file

答え3

これを行う方法は常にいくつかあります。 sed は Unix ストリームエディタです。次のように入力を変更するのに役立ちます。

while read one two three four five rest
do
  echo $one $two $three $four $five $(echo $rest | sed -e 's/T/0/g' -e 's/C/1/g')
done < input

-eフラグは解析する式を提供します。 「s」関数は、最初の引数(TまたはC)を検索して2番目の引数(0または1)に置き換えます。 sedに複数の式を提供することで、複数の操作を実行できます。ループの残りの部分では、最初の5つのフィールドのみが保持されます。

関連情報