如何使用 awk 添加新列,其中值基于现有列

如何使用 awk 添加新列,其中值基于现有列

我有一个包含多列的文件。我想根据此文件中两列的值创建一个附加列。

输入示例:

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

我有以下代码,只不过它用“1”替换了一些第 3 列值。我想保持第 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. 行: 如果$3$4A、C、G 或 T,则$7P
  3. 行:如果$3$4I、D 或 R,则$7Q
  4. 行:如果$3$4多个字母,则$7Q。最后1打印所有行。

答案2

这段代码是不言自明的并且很容易理解。您可以根据您的要求更改最后一个 else 条件,也可以忽略它。假设我们有名为“input_file.txt”的输入文件,并且我们在另一个名为“XXXX.awk”的文件中创建一个 awk prog。现在使用命令行运行它

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";
    }

相关内容