шаблон соответствия awk, если в строке нет символа - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь найти способ сопоставить шаблон в файле, только если в строке с шаблоном отсутствует определенный символ. Если он присутствует, то строку с шаблоном следует игнорировать.

Два типа линий выглядят следующим образом:

.
.
.
     total energy              =   -7693.64180923 Ry
     Harris-Foulkes estimate   =   -7693.64180923 Ry
     estimated scf accuracy    <       0.00000016 Ry
.
.
.
.
!    total energy              =   -7693.64023456 Ry
     Harris-Foulkes estimate   =   -7693.64023461 Ry
     estimated scf accuracy    <       0.00000010 Ry
.
.
.
     total energy              =   -7693.64180921 Ry
     Harris-Foulkes estimate   =   -7693.64180923 Ry
     estimated scf accuracy    <       0.00000016 Ry
.
.
.
!    total energy              =   -7693.64023459 Ry
     Harris-Foulkes estimate   =   -7693.64023461 Ry
     estimated scf accuracy    <       0.00000010 Ry

Есть ли способ сделать это? Если я подхожу к шаблонам, то появляются все строки с шаблонами. Если я сопоставляю символ !, я извлекаю строки, которые я не хочу отображать.

Спасибо

Редактировать: чтобы сделать его более понятным. Файл, который у меня есть, содержит много данных. Некоторые строки содержат pattern. Если я сделаю

awk '/total energy/' file.dat

, я получу:

     total energy              =   -7693.64180923 Ry
!    total energy              =   -7693.64023456 Ry
     total energy              =   -7693.64180921 Ry
!    total energy              =   -7693.64023459 Ry

и т.д. c. Как видите, я получаю все строки, которые содержат total energy, и среди них есть строки, которые также содержат символ ! в начале.

Моя цель - выбрать только те строки, которые содержат total energy но не содержат символ !. Таким образом, команда, которую я представляю, выглядит следующим образом, но, очевидно, имеет неправильный синтаксис:

awk '/if line contains has "total energy" and "!" then keep going else print line that has "total energy" and not "!"/' file.dat

file.dat не содержит только строки с total energy и строки с total energy и !. Там больше данных, поэтому при печати всех строк, которые не содержат строки !, ответ ниже даст мне весь файл без строк, содержащих !.

Надеюсь, это будет понятнее.

Окончательное редактирование:

используя ответ @ Ed, я смог решить свою проблему. Я выбрал числовые данные для строк, начинающихся с total energy, но исключил данные из строк, начинающихся с !. Конечной целью было также извлечь данные из двух строк под шаблоном total energy (строки, начинающиеся с estimated scf accuracy). Команда, которую я придумал после @Ed комментария, такова:

awk '/     total energy/ && !/!/{a=$4; nr[NR+2]}; NR in nr{print a,"   ",$5}' file.dat

Надеюсь, это кому-нибудь поможет!

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Звучит так, как вы, возможно, захотите:

awk '/pattern/ && !/!/' file

но посмотрите мой комментарий под вашим вопросом , поскольку на данный момент не совсем ясно, что именно вы пытаетесь сделать

0 голосов
/ 25 марта 2020

Вы должны использовать !, чтобы отменить шаблон.

awk '!/\!/{if ($0 ~ "pattern") print}'

Демо:

$echo -e '123!abc\n123#abc\n123def' 
123!abc
123#abc
123def
$echo -e '123!abc\n123#abc\n123def'  | awk '/\!/{print}' # print line with !
123!abc
$echo -e '123!abc\n123#abc\n123def'  | awk '!/\!/{print}' # print line not with !
123#abc
123def
$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...