[英]How to remove second grep match in a single line?
輸入文件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匹配? 任何建議將不勝感激。
n
如果格式不重要:
awk '{$(NF-1)=""}1' file
BRAF p.Gly464Val Non-small cell pathogenic
BAG3 p.His83Gln AllHighlyPenetrant pathogenic
EYA4 p.Gly277Ser AllHighlyPenetrant pathogenic
假定重復的文本始終總是首先出現在第二個字段中:
$ 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
說明:
不管格式如何,以下命令都可以執行此工作。
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
將用perl -pe 's/<regex>/<substitution>/' file
替換所有出現的<regex>
<substitution>
。
因此,要分解正則表達式:
(p\\.[AZ][az]{1,}[0-9]{1,}[AZ][az]{1,}.*?)
捕獲您的模式以及之后的所有內容,直到達到下一個條件。 ?
*
表示不貪心,因為您希望它第二次在模式匹配時停止。 如果不放?
並且您有第三個匹配項,或之后有多個匹配項,則它將刪除找到的最后一個匹配項,因為*
會捕獲所有可能的內容。
p\\.[AZ][az]{1,}[0-9]{1,}[AZ][az]{1,}
第二次我們使用您的圖案。 這次我們不捕獲它(no ()
),因為我們還是想丟棄它。
遵循此模式的任何內容都不會被匹配,因此不會受到影響。 然后,我們將\\1
(這是第一個捕獲的組)替換為匹配的部分,因此“忘記”了第二個匹配項。
為什么要在grep上使用perl
Grep是圍繞搜索設計的,因此很容易找到模式,但對輸出進行格式設置卻不那么容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.