perl – 删除第N次出现后的内容使用单行
发布时间:2020-12-15 23:24:16 所属栏目:大数据 来源:网络整理
导读:我想删除在第四次出现的字符“:”之后的任何字段中包含它.看例子: 输入: 1 10975 A C 1/1:137,105:245:99:1007,102,0 0/1:219,27:248:20:222,20 1 19938 T TA ./. 1/1:0,167:167:99:4432,422,12,1212 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:1007,102,0 0/1:219,27:248:20:222,20 1 19938 T TA ./. 1/1:0,167:167:99:4432,422,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,0:15:92 2/2:3,15:20:8 所以基本上任何具有“:”的字段都应该被删除.请注意,第三行没有任何变化,因为“:”仅出现三次.我试过并找到了一个解决方案(不好),它不仅适用于第一行而不适用于secod,因为它有更多的逗号“,” 不完整的解决方案: sed 's/:[0-9]*,[0-9]*,[0-9]*//g' 提前致谢 解决方法
在字段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,0:15:92 2/2:3,15:20:8 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |