指定列中的awk sub

时间:2016-03-22 11:42:52

标签: bash awk substitution

我正在尝试删除不同分隔符之前和之后的文本,仅在特定列中的第3列。

第一个分隔符是分号,第二个是逗号。它们也存在于未显示的列中。

输入数据:

chr2L   54273   2L_54273_SNP;rs203207895        A       G       999     PASS    ALTCOUNT=118;DB;REFCOUNT=69     GT      ./.     ./.     0/0 
chr2L   54339   2L_54339_SNP;rs206877787,rs80377533     T       A       999     PASS    ALTCOUNT=114;DB;REFCOUNT=73     GT      ./.     ./.  
chr2L   54587   2L_54587_SNP;rs203534836        A       G       999     PASS    ALTCOUNT=5;DB;REFCOUNT=199      GT      0/0     0/0     0/0  

必需的输出:

chr2L   54273   rs203207895        A       G       999     PASS    ALTCOUNT=118;DB;REFCOUNT=69     GT      ./.     ./.     0/0 
chr2L   54339   rs206877787     T       A       999     PASS    ALTCOUNT=114;DB;REFCOUNT=73     GT      ./.     ./.  
chr2L   54587   rs203534836        A       G       999     PASS    ALTCOUNT=5;DB;REFCOUNT=199      GT      0/0     0/0     0/0  

我的工作重点是在分号前(包括)删除文本,但没有显着结果:

awk '{ if ($3 == ".*\;//") {$3 = ""; print} else { print }; }' < a > b
sed 's/.*;//' a > b
awk '{ sub(/*.;/,"",$3) }1 ' < a > b
awk '{sub(;/./*,""); print}' < a > b

1 个答案:

答案 0 :(得分:1)

我认为你可以使用这样的东西:

awk '{ gsub(/^.*;|,.*$/, "", $3) }1' file

这匹配从第三个字段的开头到分号或从逗号到字段末尾的任何内容,并用空字符串替换它们。

您的一个问题是您使用的是*.(语法不正确)而不是.*(任何字符的零或多个)。

正如评论(谢谢)中所建议的那样,您可能希望使模式稍微严格一些,例如:

/^[^;]*;|,[^,]*$/

从开始到第一个;以及从最后一个,到结尾只会匹配。如果您确定自己的数据始终只有一个;和一个,,则这不是必需的,但需要注意。

如果您的输入是制表符分隔的,那么您可以通过指示awk来保留空格:

awk 'BEGIN { FS = OFS = "\t" } { gsub(/^.*;|,.*$/, "", $3) } 1' file

FSOFS是用于设置输入和输出字段分隔符的变量。