我有一个如下文件。我想删除包含H2
,H4
,H1
和H6
字符的所有行。为此目的,我使用了这个命令:grep -v "H1" input.gro > output.gro
。但是此命令也会删除包括H11
和H10
在内的行。在第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
答案 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值之一