次のファイルがあります。
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]