Печать чередующихся строк с условными

Все еще борется с грязными лог-файлами. Я хочу найти строки, которые сначала соответствуют строке X, а затем строке Y. Затем я хочу распечатать их вместе. Проблема в том, что иногда есть X, но нет Y.

Пример ввода

31 X 32 Y 33 X 34 Y 35 X 36 X 37 Y 38 X 39 X 

Ожидаемый результат

 31 X 32 Y 33 X 34 Y 36 X 37 Y 

Таким образом, строки 35, 38 и 39 опущены, потому что нет строки Y.

Мой старт заключается в следующем:

 cat $filename | grep -EX\|Y | grep -A1 'X' 

Но это не отфильтровывает строки 35, 38 и 39. То, что я хочу, является условным: печатайте только строки X, а затем Y, если есть Y. Если нет, ничего не печатайте.

4 Solutions collect form web for “Печать чередующихся строк с условными”

Если я правильно вас понимаю, вам нужны только строки, содержащие X, если за ними следует строка, содержащая Y, а затем вы хотите обе строки.

grep -A1 X filename |grep --no-group-separator -B1 Y

Использование sed :

 sed -n ':b /X/ { h; n; /Y/! bb; H; x; p; }' 

Вывод:

 31 X 32 Y 33 X 34 Y 36 X 37 Y 

Другой sed :

 $ sed -e '/X/{ $!N /\n.*Y/!D }' file 31 X 32 Y 33 X 34 Y 36 X 37 Y 

Существуют различные инструменты, которые могут это сделать. Если у вас есть pcregrep (он должен быть доступен в репозитории вашего дистрибутива), вы можете сделать следующее:

 $ pcregrep -M 'X\n[^\n]+Y' file 31 X 32 Y 33 X 34 Y 36 X 37 Y 

Переключатель -M позволяет шаблону сопоставляться символам новой строки, а регулярное выражение соответствует X , затем – новой строке, затем символам без символа новой строки и Y


Другой вариант – написать небольшой скрипт, который сохраняет предыдущую строку, если она соответствует X и печатает ее вместе с текущей, если текущая строка соответствует Y Например, в awk :

 $ awk '{if(last~/X/ && /Y/){print last"\n"$0}last=$0}' file 31 X 32 Y 33 X 34 Y 36 X 37 Y 

Или Perl:

 $ perl -ne '$last=~/X/ && /Y/ && print "$last$_"; $last=$_' file 31 X 32 Y 33 X 34 Y 36 X 37 Y 
  • SED Показывает CRLF, пока Vim не показывает
  • Как изменить столбец в строке в текстовом файле с разделителями табуляции, если он дублируется
  • Замена строк в файлах с содержимым файла
  • Обрезать текст без цикла
  • Условный awk через 4 столбца
  • вырезать первый и последний элемент в CSV
  • Как добавить оператор if (относительно пунктуации в слове) к этому сценарию bash
  • Как я могу отображать 3 строки текста за один раз на 1 строку?
  • Как удалить все строки, которые имеют одно значение в строке?
  • Удаление текста из файла с использованием регулярных выражений
  • Извлечение нескольких экземпляров текста между двумя словами, включая стартовое слово, но исключающее слово
  • Interesting Posts

    скрипт python для минимизации всех удаленных окон

    Понимание ошибок smartctl и жесткого диска

    Как переместить процесс из одного пространства имен в другое?

    В bash вместо создания новой строки изменения уже сделанной строки

    Можно ли преобразовать раздел ext3 в ext4 без форматирования?

    Разрешения меняются с mkdir на mount

    Как настроить weechat для подключения к facebook google talk и skype?

    Есть ли способ редактировать заголовок самого GNU GRUB2 (а не название записи в меню)?

    Можно ли обойти команду crontab, поместив файл?

    Добавить команду echo в / etc / profile, чтобы отключить гашение экрана

    Что такое «плохой список v: нет такого файла или каталога в / usr / libdata / per15 / OpenBSD / Pkg_Add.pm line 1115» означает?

    Как убить все процессы с использованием данного GPU?

    mv to nfs "не может создать обычный файл … файл существует", но создает пустой файл

    Прерывание наблюдения за успешным выполнением команды

    Разрешения на ftp'd-файлы, похоже, не соответствуют umask

    Linux и Unix - лучшая ОС в мире.