Я пытаюсь найти способ сопоставить шаблон в файле, только если в строке с шаблоном отсутствует определенный символ. Если он присутствует, то строку с шаблоном следует игнорировать.
Два типа линий выглядят следующим образом:
.
.
.
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
Надеюсь, это кому-нибудь поможет!