列の短い繰り返し単語を数値に変換

列の短い繰り返し単語を数値に変換

列の短い繰り返し単語を数字に変換したいです。

(with ONLY 2 LETTERS)以下の例では、3列の単語を数字に変更して、または、またはにAA変更できるようにしたいと思います。2ABBA1BB0

最初と2番目の列には、およびを含めることもAAできBBますABBAこれは変更しないでください。

" "列は()で区切られます。

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

関連情報