Использовать awk для вставки строки после вывода N

У меня есть текстовый файл, заполненный кучей данных. Мне нужно вытащить строки, содержащие конкретные строки. Я выполнил это с помощью awk, используя следующее:

awk '/pattern1|pattern2|pattern3/ {print;}' infile 

Затем мне нужно поместить новую строку (\ n) после 3-ей строки. Так что это должно выглядеть так

 pattern1 pattern2 pattern3 <new line> pattern1... 

Я смог выполнить это, соединив первую команду в другой оператор awk

 awk -F '\n' '/pattern1|pattern2|pattern3/ { print; }' infile | awk '{ if ((NR % 3) == 1) printf("\n"); print; }' 

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

 awk '/pattern1|pattern2|pattern3/ { if ((NR % 3) ==1 ) printf("\n"); print; }' 

Я полагал, что это сработает, но выход полностью непредсказуем, иногда есть 5 строк, сгруппированных вместе, группы из 2 строк, но не строки из 3.

Я думал, что, возможно, проблема с разделителями, поэтому я попытался сыграть с опцией -F и установить IFS, но не изменил вывод.

Я полагаю, что я делаю что-то глупое в том, как я попытался совместить совпадение шаблона с оператором if, но я не смог понять эту комбинацию.

Является ли то, что я пытаюсь сделать в одной команде awk? И если да, то где я иду не так?

  • Есть ли ссылка для ассемблерного вывода, созданного `awk -W dump`?
  • Как добавить добавочный счет в каждую строку текстового файла?
  • bash: содержание grepping столбца, которое является динамическим
  • Распечатайте n строк до match1 И строки после match1 до match2
  • Как вывести разницу между двумя файлами?
  • Простая переменная, установленная в Awk
  • Удалить запятую между кавычками только в файле с разделителями-запятыми
  • проанализировать файл журнала, который принимает аргумент (время выполнения тестов)
  • 2 Solutions collect form web for “Использовать awk для вставки строки после вывода N”

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

    Я не думаю, что awk держит такой счет изначально, но вы могли бы сделать что-то вроде

     awk '/pattern1|pattern2|pattern3/ {print; if (++onr%3 == 0) print ""; }' infile 

    в которой мы определяем новую переменную onr (для выходного номера записи – имя переменной произвольно) и увеличиваем ее каждый раз, когда мы сопоставляем / печатаем желаемый текст, а затем проверяем , является ли это делимым на 3, и если да, то напечатайте новую строку.

    правильно ли я понимаю, вы пытаетесь изобрести

     awk '/pattern1|pattern2/ {print $1;} /pattern3/ {print $1 "\n"}' infile 
    Linux и Unix - лучшая ОС в мире.