#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. Да, для этого должен работать весь первый набор ответов 🙂 Просто посмотрите перед последним редактированием