Использовать 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? И если да, то где я иду не так?

  • Использование df и попытка awk определенного столбца
  • Извлечение многострочного регулярного выражения без вкладок
  • Как подсчитать количество слов каждого предложения в файле с помощью команды оболочки?
  • как изменить содержимое одного столбца в файле?
  • Использование sed для замены кода javascript в нескольких файлах
  • Использование awk для объединения двух файлов
  • Подсчет количества записей в столбце 2, где столбец 1 аналогичен
  • Стратегия для извлечения имени фильма из этого неравномерного набора данных?
  • 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 - лучшая ОС в мире.