Как получить первую строку после совпавшей строки независимо от наличия строки - PullRequest
1 голос
/ 04 июня 2019

Скажите, у меня есть это в качестве ввода:

..pattern1...this
..pattern1...1
..pattern1...2
...

Или

..pattern1...0
..pattern2...0
..pattern1...1
..pattern2...1
..pattern2...2
..pattern1...this
...

т.е. список строк, содержащий только два типа паттернов (строк). Я пытаюсь получить первую строку pattern1 после последней строки pattern2. Если нет pattern2, то первая строка pattern1. Пример вывода для обоих случаев будет:

 ..pattern1...this

Я могу выполнить любой из этих случаев отдельно с помощью sed ( как с этим ответом ), но я не смог получить команду, которая выполняла бы оба объявления одновременно.

Кто-нибудь может прыгнуть и протянуть руку? Спасибо!

Ответы [ 2 ]

1 голос
/ 04 июня 2019
awk '/pattern1/ && !line{line=$0} /pattern2/{line=""} END{print line}' file
  1. Когда найдено pattern1, задайте для переменной line всю строку.
  2. Когда мы снова найдем pattern1, проигнорируем его.(поскольку line уже будет установлено.)
  3. Когда найдено pattern2, сбросьте переменную line, чтобы учитывалось следующее вхождение pattern1.

И в ответе Эда Мортона уже упоминалось, как обращаться, если вам нужно точное совпадение строк или если вы хотите взять шаблон из переменной оболочки.Добавление моего ответа только для того, чтобы предположить, что использования tac можно избежать.

1 голос
/ 04 июня 2019

Учитывая одну интерпретацию вашего вопроса, это может быть то, что вам нужно:

Если pattern означает regexp и все в порядке с частичными, а не полными совпадениями, то:

tac file | awk '/pattern1/{line=$0; f=1} /pattern2/{exit} END{if (f) print line}'

Если вам нужны полные совпадения регулярных выражений, добавьте начальные / конечные якоря (/^pattern1$/) и сравните их с конкретным полем (например, $4 ~ /^pattern1$/) вместо всей строки, если вам нужно слово вместо совпадений строк.

Если вам нужно совпадение строк вместо регулярного выражения, тогда используйте index() или == против $0 или $N (где N - номер целевого поля) в зависимости от ситуации.

Если pattern1 и pattern2 являются переменными оболочки и дан целый ряд предположений о том, каким может быть "pattern":

tac file | awk -v re1="$pattern1" -v re2="$pattern2" '$0 ~ re1{line=$0; f=1} $0 ~ re2{exit} END{if (f) print line}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...