指定列中的 awk sub

awk sub in specified column

我试图删除不同定界符前后的文本,仅在特定列中,第 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 ( == ".*\;//") { = ""; print} else { print }; }' < a > b
sed 's/.*;//' a > b
awk '{ sub(/*.;/,"",) }1 ' < a > b
awk '{sub(;/./*,""); print}' < a > b

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

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

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

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

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

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

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

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

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

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