次のファイルがあります。
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
の値は$5
1に設定されます。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 から終了までのみ適用されることを意味します。最後に変更された配列を印刷します。perl
awk
@F
$F[3]
0
$F[4]
1
for @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つのフィールドのみが保持されます。