如何在一行中删除第二个grep匹配?

时间:2014-06-26 15:54:16

标签: regex bash unix grep

输入文件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

3 个答案:

答案 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

说明:

  1. 第一个括号匹配第一个字段&之后的空格。
  2. 第二个括号与第二个字段匹配。
  3. 第三个括号匹配任何文本,直到再次找到第二个字段。
  4. 然后匹配重复的第二场&之后的任何空格。
  5. 匹配最后一个括号中的所有内容。
  6. 最后,除了重复的第二场之外,将其替换为所有内容。

答案 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是围绕搜索设计的,因此很容易找到模式,但输出格式不容易。