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 

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

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 
  • Как вычесть два раза в оболочке
  • Как я могу удалить весь текст между фигурными скобками в многострочном текстовом файле?
  • Как найти конкретную строку и распечатать всю строку?
  • Я не могу печатать пустые строки при чтении значений из текстового файла с помощью awk в сценарии bash
  • awk: 0602-562 Поле $ () неверно. в сценарии ksh на AIX
  • Выберите последний файл, основанный на порядковом номере, указанном в имени файла
  • Удалите определенную команду латекса из текста и закрывающей скобки за ней
  • вырезать столбец int array в CSV без обрезки другого массива varchar
  • Добавление соответствующих номеров в диапазон
  • Использование AWK для преобразования чисел в 0 или 1
  • Печать уникальной команды who
  • Interesting Posts

    Как я могу удалить слово назад в командной строке (bash и zsh)?

    Установите пользовательские локали в Gnome3 (на Fedora 20)

    Монтирование cifs с использованием файла учетных данных

    Какому пользователю я должен создавать и выполнять задания cron как? Apache? Root? Меня?

    не работает в Arch Linux

    Формат / etc / hosts в Linux (отличается от Windows?)

    Сохранение копий файла журнала X в Debian

    Как перенаправить вывод на cd?

    Как выйти или отменить команду bad bash?

    RedHat-кластер с rgmanager или кардиостимулятором в качестве менеджера ресурсов в Oracle VirtualBox

    Программно получить подробное использование процессоров, например top / htop

    Щелкните правой кнопкой мыши, чтобы скопировать имя файла (или имя каталога)

    Как удалить строки в текстовом файле, содержащие три дублирующихся поля (строки sep пробелами)

    Использовать GnuPG по умолчанию в Evolution

    Белый список определенных двоичных файлов и скриптов внутри монтирования noexec / nosuid?

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