我有一个很长的 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 发行版中)。