如何 grep 不包含具有特定字符的单词的行,但包含该字符的某些单词实例除外

如何 grep 不包含具有特定字符的单词的行,但包含该字符的某些单词实例除外

我有一个很长的 file.txt,其中有数百行,包含很多行,例如这些:

CD  H1
CD  H123 
CD  C2 
CD  D1
CD  H2FOO
CD  HXY

我想要的文件不包含以 H 开头的单词的行,除了包含单词 H1 的行,即我想要以下行:

CD  H1 
CD  C2 
CD  D1

谢谢。

编辑,完整示例的一部分:

ATOM    127  HN1 POPE    2      -1.381  -4.751  17.480  1.00  0.00      MEMB
ATOM    128  HN2 POPE    2      -2.752  -4.808  18.466  1.00  0.00      MEMB
ATOM    129  HN3 POPE    2      -2.694  -3.943  16.950  1.00  0.00      MEMB
ATOM    130  C12 POPE    2      -1.684  -3.060  18.702  1.00  0.00      MEMB
ATOM    131 H12A POPE    2      -0.774  -2.666  18.200  1.00  0.00      MEMB
ATOM    132 H12B POPE    2      -1.447  -3.420  19.726  1.00  0.00      MEMB
ATOM    133  C11 POPE    2      -2.802  -1.944  18.718  1.00  0.00      MEMB
ATOM    134 H11A POPE    2      -3.229  -1.764  17.709  1.00  0.00      MEMB
ATOM    135 H11B POPE    2      -2.235  -1.057  19.074  1.00  0.00      MEMB
ATOM    136  P   POPE    2      -5.353  -2.326  19.349  1.00  0.00      MEMB
ATOM    137  O13 POPE    2      -5.649  -1.230  18.368  1.00  0.00      MEMB

我想要以下几行:

ATOM    127  HN1 POPE    2      -1.381  -4.751  17.480  1.00  0.00      MEMB
ATOM    129  HN3 POPE    2      -2.694  -3.943  16.950  1.00  0.00      MEMB
ATOM    130  C12 POPE    2      -1.684  -3.060  18.702  1.00  0.00      MEMB
ATOM    133  C11 POPE    2      -2.802  -1.944  18.718  1.00  0.00      MEMB
ATOM    136  P   POPE    2      -5.353  -2.326  19.349  1.00  0.00      MEMB
ATOM    137  O13 POPE    2      -5.649  -1.230  18.368  1.00  0.00      MEMB

因此,根据这个例子重新表述问题:我需要不包含以 H 开头的单词的行,除了包含单词 HN1 和 HN3 的行

答案1

由于您的数据记录是结构化的(作为空格分隔的列),您可能会发现使用 awk 更容易,这样您就可以定位特定的列。

使用单独测试的 KISS 方法

awk '$3 ~ /^[^H]/ || $3 == "H1"' file

或(仅使用正则表达式)

awk '$3 ~ /^([^H]|H1$)/' file

答案2

希望这可以帮助:

cat file.txt | grep -v H[1-9] > tofile.txt

答案3

使用负向匹配 ( grep -v) 和否定后视来拒绝 HN1/HN3:

grep -Pv '\sH(?!N[13]\s)' <data

grep -P(perl regex,需要后视支持)是非 POSIX 的并且仅在 Gnu grep 中(grep在大多数 Linux 发行版中)。

相关内容