Печатать строки, соответствующие шаблону, только если следующая строка не соответствует шаблону

#awk

#awk

Вопрос:

Я хочу использовать awk для печати строк, соответствующих шаблону, только если следующая строка не соответствует шаблону. В этом случае шаблон заключается в том, что строка начинается с O. Это то, что я пробовал:

 awk '!/^O/ {print x}; /^O/ {x=$0}' myfile.txt 
  

Однако это печатает слишком много строк, включая печать строк, которые я специально не хочу печатать.

Ответ №1:

Не проверено. Должен ли probz работать

 awk '/^O/{if(seen==0){seen=1};c=$0} !/^O/{if (seen==1) {print c; seen=0;}}' myfile.txt
  

Сокращенная версия

  awk '/^O/{x=$0} !/^O/{if(x!=0) {print x; x=0;}}' myfile.txt
  

Еще большее сокращение

 awk '/^O/{x=$0} !/^O/{if(x){print x;x=0;}}' myfile
  

Думаю, это самый короткий путь

 awk '/^O/{x=$0} !/^O/amp;amp;x{print x;x=0;}' myfile
  

Изменил их все, потому что он напечатал неправильные строки.

также сделал его короче 🙂

 awk 'a=/^O/{x=$0} !aamp;amp;x{print x;x=0;}' myfile
  

Комментарии:

1. Обновленные запросы действительно решают именно ту проблему, которую я поставил. Однако оказывается, что проблема, с которой я сталкиваюсь, несколько отличается от того, что я первоначально думал. Вот обновленный вопрос: для каждой группы последовательных строк, соответствующих шаблону, печатайте только первую. Если существует группа из 2 или 3 или более последовательных строк, начинающихся с O, печатайте только первую из этих строк. Как только встречается строка, не соответствующая шаблону, это должно сбросить состояние. Среди следующей группы последовательных строк O должна быть напечатана только первая и так далее.

2. О, и на случай, если это было неясно: если встречается одиночная строка O, распечатайте ее. Итак, вкратце: для каждой группы из 1 или более последовательных строк, соответствующих шаблону, выведите первую строку в группе.

3. Кажется, это помогает: awk '/^O/{if(seen==0){seen=1;print $0}} !/^O/{if (seen==1) {seen=0}}'

4. Да, для этого должен работать весь первый набор ответов 🙂 Просто посмотрите перед последним редактированием