awkを使用して既存の列に基づいて値を持つ新しい列を追加する方法

awkを使用して既存の列に基づいて値を持つ新しい列を追加する方法

複数の列を含むファイルがあります。このファイルの2つの列の値に基づいて追加の列を作成したいと思います。

入力例:

A B C D E F
1 2 T TACA A 3 2
3 4 I R 8 2
9 3 A C 9 3
  1. 3列と4列(CとDで表される)の値が文字A、C、G、またはTの場合、7列はPでなければなりません。
  2. 3列と4列の文字がI、D、Rの場合、7列はQでなければなりません。
  3. 3列または4列に複数の文字がある場合、7列はQでなければなりません。

希望の出力:

A B C D E F G
1 2 T TACA A 3 2 Q
3 4 I R 8 2 Q
9 3 A C 9 3 P

列3の値の一部を「1」に置き換える以外は、次のコードがあります。列1〜6を変更せずに維持したいです。

awk '{if ((($3!="A" && $3!="C" && $3!="G" && $3!="T") || ($3="I" || $3="D" || $3="R")) || (($4!="A" && $4!="C" && $4!="G" && $4!="T") || ($4="I" || $4="D" || $4="R"))) { $7 = "INDEL" } else { $7 = "SNP" }}1' filename > newfilename

答え1

これは以下に適用されますmawk

awk 'NR==1{$7="G";print;next} \
  $3~/^[A,C,G,T]$/ || $4~/^[A,C,G,T]$/ {$7="P"} \
  $3~/^[I,D,R]$/ || $4~/^[I,D,R]$/ {$7="Q"} \
  $4~/[A-Z][A-Z]/ || $3~/[A-Z][A-Z]/ {$7="Q"} 1' file
  1. 行:最初の行にタイトルを書きますG
  2. 行:$3A $4、C、G、またはTの場合は$7YesですP
  3. 行:$3I $4、D、またはRの場合は$7YesですQ
  4. 行:複数の文字$3の場合は例です。最後に、すべての行を印刷します。$4$7Q1

答え2

このコードは説明を必要とせず、理解しやすいです。要件に応じて、最後のelse条件を変更または無視できます。 「input_file.txt」という入力ファイルがあり、「XXXX.awk」という別のファイルにawkプログラムを生成するとします。それでは、コマンドラインを使って実行してみてください。

awk -f XXXX.awk 入力ファイル.txt

    BEGIN { 
       FS=" ";
    }
    {
        if(NR==1) print $0" G";
        else if(length($4)>1 || length($3)>1) print $0" Q";
        else if($3 ~ /[I,D,R]/ && $4 ~ /[I,D,R]/) print $0" Q";
        else if($3 ~ /[A,C,G,T]/ && $4 ~ /[A,C,G,T]/) print $0" P";
        else print $0" NA";
    }

関連情報