输入文件1
BRAF p.Gly464Val Non-small cell p.Gly464Val pathogenic
BAG3 p.His83Gln AllHighlyPenetrant p.His83Gln pathogenic
EYA4 p.Gly277Ser AllHighlyPenetrant p.Gly277Ser pathogenic
myCmd
egrep "p\.[A-Z][a-z]{1,}[0-9]{1,}[A-Z][a-z]{1,}" file1
预期输出
BRAF p.Gly464Val Non-small cell pathogenic
BAG3 p.His83Gln AllHighlyPenetrant pathogenic
EYA4 p.Gly277Ser AllHighlyPenetrant pathogenic
如何删除第二个grep匹配?任何建议将不胜感激
日Thnx
答案 0 :(得分:1)
如果格式不重要:
awk '{$(NF-1)=""}1' file
BRAF p.Gly464Val Non-small cell pathogenic
BAG3 p.His83Gln AllHighlyPenetrant pathogenic
EYA4 p.Gly277Ser AllHighlyPenetrant pathogenic
答案 1 :(得分:1)
假设重复的文本始终首先显示为第二个字段:
$ cat input.txt
BRAF p.Gly464Val Non-small cell p.Gly464Val pathogenic
BAG3 p.His83Gln AllHighlyPenetrant p.His83Gln pathogenic
EYA4 p.Gly277Ser AllHighlyPenetrant p.Gly277Ser pathogenic
$ sed -r 's/^([^ ]* *)([^ ]*)(.*)(\2 *)(.*)/\1\2\3\5/' input.txt
BRAF p.Gly464Val Non-small cell pathogenic
BAG3 p.His83Gln AllHighlyPenetrant pathogenic
EYA4 p.Gly277Ser AllHighlyPenetrant pathogenic
说明:
答案 2 :(得分:0)
无论格式如何,以下命令都应该完成。
perl -pe 's/(p\.[A-Z][a-z]{1,}[0-9]{1,}[A-Z][a-z]{1,}.*?)p\.[A-Z][a-z]{1,}[0-9]{1,}[A-Z][a-z]{1,}/\1/' file
perl -pe 's/<regex>/<substitution>/' file
会将所有<regex>
替换为<substitution>
。
所以要打破正则表达式:
(p\.[A-Z][a-z]{1,}[0-9]{1,}[A-Z][a-z]{1,}.*?)
捕捉你的模式和任何事物,直到它达到下一个条件。 ?
之后的*
是非贪婪的,因为您希望它在第二次模式匹配时停止。如果你没有放置?
并且你有第三场比赛,或之后有更多的比赛,那么它会删除它找到的最后一场比赛,因为*
会抓住它所能做的一切。
p\.[A-Z][a-z]{1,}[0-9]{1,}[A-Z][a-z]{1,}
我们第二次使用你的模式。这次我们没有捕获它(没有()
),因为我们想要丢弃它。
此模式后的任何内容都不会匹配,因此不会受到影响。然后,我们将匹配部分的\1
替换为第一个捕获的组,因此“忘记”第二个匹配。
为什么perl over grep
Grep是围绕搜索设计的,因此很容易找到模式,但输出格式不容易。