Как к 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 кроме строк с Word HN1 и HN3

1
задан 10 November 2019 в 01:56

3 ответа

Так как Ваши записи данных структурированы (поскольку пробел разграничил столбцы), можно найти легче использовать awk так, чтобы можно было быть нацелены на определенный столбец.

подход KISS с помощью отдельных тестов

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

или (использующий regex только)

awk '$3 ~ /^([^H]|H1$)/' file
2
ответ дан 7 December 2019 в 13:13

Надежда это помогает:

cat file.txt | grep -v H[1-9] > tofile.txt
0
ответ дан 7 December 2019 в 13:13

Отрицательное соответствие использования (grep -v) с отрицанием оглядывается, который отклоняет HN1/HN3:

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

grep -P (жемчуг regex, требуемый для оглянуться поддержки) неPOSIX и только у Гну grep (grep в большинстве дистрибутивов Linux).

0
ответ дан 7 December 2019 в 13:13

Другие вопросы по тегам:

Похожие вопросы: