删除第N次出现后的内容使用单行

时间:2013-11-10 08:28:57

标签: perl sed awk gawk nawk

我想删除在第四次出现的字符“:”之后的任何字段中包含它。参见示例:

输入:

1 10975     A C    1/1:137,105:245:99:1007,102,0   0/1:219,27:248:20:222,0,20 
1 19938     T TA   ./.                             1/1:0,167:167:99:4432,422,0,12,12
12 20043112 C G    1/2:3,5,0:15:92                 2/2:3,15:20:8

预期产出:

1 10975     A C    1/1:137,105:245:99   0/1:219,27:248:20 
1 19938     T TA   ./.                  1/1:0,167:167:99
12 20043112 C G    1/2:3,5,0:15:92      2/2:3,15:20:8

所以基本上任何具有“:”的字段都应该被删除。请注意,第三行没有任何变化,因为“:”仅出现三次。我试过并找到了一个解决方案(不好),它不仅适用于第一行而不适用于secod,因为它有更多的逗号“,”

不完整的解决方案:

sed 's/:[0-9]*,[0-9]*,[0-9]*//g'

提前致谢

4 个答案:

答案 0 :(得分:5)

桑达:

sed -r 's/((:[^: \t]*){3}):[^ \t]*/\1/g' file | column -t

的Perl:

perl -pe 's/((:\S*){3}):\S*/$1/g' file | column -t

答案 1 :(得分:3)

使用sed

sed -r 's/((:[^ ]*){3}):[^ ]*/\1/g' file

输出:

1 10975     A C    1/1:137,105:245:99   0/1:219,27:248:20 
1 19938     T TA   ./.                             1/1:0,167:167:99
12 20043112 C G    1/2:3,5,0:15:92                 2/2:3,15:20:8

使用perl

perl -pe 's/((:\S*){3}):\S*/$1/g' file

答案 2 :(得分:2)

在字段5到最后一个字段中,这将删除第四次出现的正则表达式:[^:]+

< file.txt awk '{ for (i=5; i<=NF; i++) $i = gensub(/:[^:]+/, "", 4, $i) }1' | column -t

在字段5到最后一个字段中,这将删除第四个:

之后的所有内容
< file awk '{ for (i=5; i<=NF; i++) $i = gensub(/((:[^:]+){3}).*/, "\\1", 1, $i) }1' | column -t

<强>解释

重新阅读您的问题后,第二种解决方案可能正是您所寻找的。第一个解决方案是查找冒号后跟一个或多个字符而不是冒号并删除它们。 gensub()的第三个参数描述了要替换的正则表达式的哪个匹配。所以4告诉gensub()删除模式的第四个匹配。第二个解决方案,查找第一个答案中描述的三组正则表达式。此时值得一提的是,gensub()提供了使用sub()gsub()无法使用的其他功能。这是在替换文本中指定正则表达式的组件的能力,就像其他语言如何使用括号来执行捕获一样。 gensub()是一个非常强大的命令,只能使用GNU awk。提供的说明和示例here非常有用。 HTH。

结果:

1   10975     A  C   1/1:137,105:245:99  0/1:219,27:248:20
1   19938     T  TA  ./.                 1/1:0,167:167:99
12  20043112  C  G   1/2:3,5,0:15:92     2/2:3,15:20:8

答案 3 :(得分:0)

perl -lane 's/(.*?:.*?:.*?:.*?):.*/$1/g  for @F ; printf "@F"."\n"' your_file