删除包含特定单词(字母和数字)的行

时间:2015-04-30 02:00:56

标签: bash

我有一个如下文件。我想删除包含H2H4H1H6字符的所有行。为此目的,我使用了这个命令:grep -v "H1" input.gro > output.gro。但是此命令也会删除包括H11H10在内的行。在第10000行之后,它不会删除这些行。我该如何修理我的命令? P.S:我应该保留输出文件中列之间的间距。

XYX    C1    1   3.339   0.189   
XYX   H11    2   3.376   0.253   
XYX    H2    3   3.276   0.260  
XYX   H10    4   3.262   0.127   
XYX    C1    5   3.443   0.115  
XYX    H4    6   3.491   0.193   
XYX    H1    7   3.393   0.048  
XYX    B3    8   3.552   0.057  
XYX    H6    9   3.512   0.026
...    ..    .   .....   .....
XYX    H1 9998   3.294   4.293
XYX    H2 9999   3.379   4.287 
XYX    H310000   3.377   4.151  
XYX   H1110001   0.217   3.143  
XYX    N110002   0.299   3.109   
XYX   H1010003   0.318   3.022   
XYX    C410004   0.277   3.096  

3 个答案:

答案 0 :(得分:1)

最简单的破解方法是在表达式后面添加一个空格。要处理多个不同的字符,可以使用表示表达式中多个字符之一的字符类。

grep -v "H[1246] " input.gro > output.gro

更简洁的方法是使用不太脆弱的单词边界,只有当它形成一个"单词时才允许grep匹配模式。其中word被定义为一系列字母数字字符和下划线。

grep -v "\bH[1246]\b" input.gro > output.gro

答案 1 :(得分:0)

Awk是一种非常易读的方法,不需要黑客攻击。

awk '$2!~/H[1246]$/' input.gro > output.gro

答案 2 :(得分:0)

Grep,至少其中一些人-w只能匹配整个单词。所以你可以做到

grep -v -w "H1" input.gro > output.gro

或所有这些匹配

grep -v -w "H[1246]" input.gro > outout.gro

如果您对下一列中的字符运行到H1列时遇到问题进行了编辑,也许可以试试这个:

egrep -v "^.{7}H[1246]"

将其锚定到该行的开头,忽略前7个字符,然后确保您拥有所需的H值之一