awk распечатать совпадение, только если последняя запись перед другим совпадением

Я хочу использовать awk для печати соответствия некоторого шаблона, только если это последняя строка файла перед некоторым постоянным текстом.

Например, я хочу напечатать значение «c», только если это последняя строка перед некоторым постоянным текстом:

cat file.txt: a=1 b=2 c=3 ...constant text... 

печать 3.

 cat file.txt: a=1 c=3 b=2 ...constant text... 

ничего не печатайте.

Как это сделать..? Как awk может узнать, является ли это последним номером файла?

  • отображать строки, содержащие не более 4 слов во втором столбце
  • удалить дублируемую запись из файла1, если запись присутствует в файле2
  • определение номера столбца с использованием строки в awk
  • Разделить на несколько файлов на основе первого столбца при согласовании числовых диапазонов в другом столбце с awk
  • Замена текста между двумя комментариями HTML
  • Переменная Bash в скрипте Awk
  • AWK с одним десятичным знаком
  • Присоедините линию рисунка и последовательные непустые строки, разделенные запятыми и заключенные в ()
  • 2 Solutions collect form web for “awk распечатать совпадение, только если последняя запись перед другим совпадением”

    Я хочу использовать awk для печати соответствия некоторого шаблона, только если это последняя строка файла перед некоторым постоянным текстом.

    В этом случае попробуйте следующее:

     awk -F= '/constant text/ && name=="c"{print value} {name=$1;value=$2}' file 

    Примеры

     $ cat file1 a=1 b=2 c=3 ...constant text... $ awk -F= '/constant text/ && name=="c"{print value} {name=$1;value=$2}' file1 3 $ cat file2 a=1 c=3 b=2 ...constant text... $ awk -F= '/constant text/ && name=="c"{print value} {name=$1;value=$2}' file2 $ 

    Как это работает

    • -F=

      Это говорит awk использовать = в качестве разделителя полей. Таким образом, мы можем отделить имя и значение для полей, таких как a=1 или c=3 .

    • /constant text/ && name=="c"{print value}

      Если мы достигнем строки с constant text и name (как последним, установленным в предыдущей строке), c , тогда напечатайте value .

    • name=$1;value=$2

      Для текущей строки сохраните первое поле как name и второе поле как value .

    Некоторые поисковики нашли мне лучший ответ, хотя у меня уже есть ответ: использование tac делает его намного проще …

    tac file | awk 'NR==2{if ( $1=="c") print $2}'

    Номер строки один после «постоянного текста». Если «постоянный текст» – одна строка – NR==2 . Если это две строки – NR==3 . Еще не решил, в каком формате должен быть постоянный текст …

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