列の短い繰り返し単語を数字に変換したいです。
(with ONLY 2 LETTERS)
以下の例では、3列の単語を数字に変更して、または、またはにAA
変更できるようにしたいと思います。2
AB
BA
1
BB
0
最初と2番目の列には、およびを含めることもAA
できBB
ますAB
。BA
これは変更しないでください。
" "
列は()で区切られます。
Id_animal Id_SNP Allele
ID01 rs01 AB
ID02 rs01 BA
ID03 rs01 AA
ID04 rs01 BB
希望の出力は次のとおりです。
Id_animal Id_SNP Allele
ID01 rs01 1
ID02 rs01 1
ID03 rs01 2
ID04 rs01 0
答え1
sed -i.bak -r 's/ AA$/ 2/;s/ (AB|BA)$/ 1/;s/ BB$/ 0/' input
-i.bak
場所で編集して元のファイルのバックアップを作成するinput.bak
-r
拡張正規表現構文s/ AA$/ 2/
「AA」の終了文字シーケンスを2に置き換えます。(AB|BA)
ABまたはBA;
別々の交換作業の分離
答え2
そしてawk
:
awk 'BEGIN {
t["AA"] = 2
t["AB"] = t["BA"] = 1
t["BB"] = 0
}
$3 ~ /^[AB][AB]$/ { $3 = t[$3] }
1' data.txt
答え3
試しているPerlソリューションを追求したい場合は、次の方法を使用することがあります。ハッシュ単純なルックアップテーブルとして、例えば
%table = ("AA" => 2,"AB" => 1,"BA" => 1,"BB" => 0)
次に、その値を@F[2]
キーとして使用します。例えば
perl -alne '
%table = ("AA" => 2,"AB" => 1,"BA" => 1,"BB" => 0);
print $.==1? $_ : join " ", @F[0,1], $table{@F[2]}
' file
Id_animal Id_SNP Allele
ID01 rs01 1
ID02 rs01 1
ID03 rs01 2
ID04 rs01 0
実際にはありますが、はいPerlを使用して説明する単純なケースを実行する方法tr
- 音訳の数を返すので。したがって、戻り値を使用してtr /A//
Asの数を計算できます。
perl -alne 'print $.==1? $_ : join " ", @F[0,1], @F[2] =~ tr/A//' file
Id_animal Id_SNP Allele
ID01 rs01 1
ID02 rs01 1
ID03 rs01 2
ID04 rs01 0
はるかに簡単です(分割と接続の代わりに正規表現を使用してターゲット文字列を識別します)。
perl -pe 's/\b[AB]{2}\b/$& =~ tr{A}{}/ge' file
awk
つまり、同じトリックを使用できます。
awk 'FNR>1 {$3 = gsub(/A/,"",$3)}1' file