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 в скрипте
  • помочь построить grep-выход
  • удалить строки, где значение поля меньше или равно 3 - sed или 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 - лучшая ОС в мире.