awk изменит следующую строку после сопоставления шаблона, основанного на другом совпадении шаблонов

У меня есть файл с такими строками, как:

.... pattern1 100 200 300 pattern2 300 400 400 pattern1 300 900 700 pattern1 200 500 900 ... 

Как показано в приведенном выше примере, существуют некоторые строки, где pattern2 следует за pattern2 но не для всех. Я хотел бы сопоставить pattern2 и проверить, имеет ли следующая строка pattern2 и если это так, pattern2 поле следующего числа, умножив его на постоянный коэффициент. Я попытался использовать getline с awk но он стирает строки с pattern1 из полученного результата:

 awk '/pattern1/{getline; if($1==pattern2) $(NF-2)*=0.889848406214}1' infile.dat 

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

  • Как получить значения индекса для нескольких совпадений в одной строке в awk?
  • Остановить обработку одной строки в awk после успешного совпадения?
  • Добавить порядковый номер за словом данных
  • GREP / SED или AWK: печать всего абзаца в файле по совпадению с образцом
  • сценарий оболочки для извлечения символов
  • Как объединить строки и цифры
  • предельные выходы awk
  • Разделить большой файл журнала на части на основе даты
  • 2 Solutions collect form web for “awk изменит следующую строку после сопоставления шаблона, основанного на другом совпадении шаблонов”

     awk ' /pattern1/ { f = 1; print; next } f && /pattern2/ { $(NF-2) *= 0.889848406214 } { f = 0; print } ' <file 

    Ваш подход не getline потому что getline немедленно переходит к следующей строке, так что текущий потерян. Простым решением было бы сохранить текущую строку в переменной, а затем перейти к следующей:

     $ awk '{ if(/pattern1/){ l=$0; getline; if($1=="pattern2"){ $(NF-2)*=0.889848406214 } print l"\n"$0 } else{print} }' file pattern1 100 200 300 pattern2 266.955 400 400 pattern1 300 900 700 pattern1 200 500 900 

    Кроме того, используйте флаг, который отслеживает, соответствует ли предыдущая строка 1 pattern1 :

     $ awk '{if(/pattern2/ && l){$(NF-2)*=0.889848406214} /pattern1/ ? l=1 : l=0;}1;' file pattern1 100 200 300 pattern2 266.955 400 400 pattern1 300 900 700 pattern1 200 500 900 
    Linux и Unix - лучшая ОС в мире.