我有一个包含多列的文件。我想根据此文件中两列的值创建一个附加列。
输入示例:
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
- 如果第 3 列和第 4 列(标记为 C 和 D)中的值是字母 A、C、G 或 T,则第 7 列应为 P。
- 如果第 3 列和第 4 列中的字母是 I、D 或 R,则第 7 列应为 Q。
- 如果第 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
- 行:在第一行中写入
G
标题。 - 行: 如果
$3
是$4
A、C、G 或 T,则$7
是P
。 - 行:如果
$3
是$4
I、D 或 R,则$7
是Q
。 - 行:如果
$3
是$4
多个字母,则$7
是Q
。最后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";
}