Intereting Posts
Каков порядок сортировки при использовании условных операторов? Какие папки нужно установить перед chroot? Создание отдельной таблицы из нескольких файлов Как проверить, установлен ли какой-либо патч в моей системе? Зацикливание по папке в любом случае входит в цикл Отладка с помощью программирования оболочки и файлов cpp? Qualcomm Atheros AR298X не работает с последними ядрами Сценарий, вызывающий ifconfig и службу openvpn, не будет работать, но если интерфейс уже работает, он работает Проблемы с кодировкой немецких справочных страниц mkdosfs для форматирования SD-карты Dashcam FAT32 с размером кластера 32kb Как выполнить сравнение строк игнорировать пробелы? Как я могу сжать файлы с именем вывода, таким же, как родительская папка? Удаляет ли rsync файлы в месте назначения, которые были удалены со стороны отправки? Удалите вторую строку, где первые несколько столбцов идентичны в большом файле символическая ссылка новая цель

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

Все еще борется с грязными лог-файлами. Я хочу найти строки, которые сначала соответствуют строке 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. Если нет, ничего не печатайте.

Если я правильно вас понимаю, вам нужны только строки, содержащие 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