Использовать 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
  • Подводя массив внутри awk?
  • иметь файл журнала, который я хотел бы разбить на несколько файлов на основе контента
  • Я хочу скопировать строки из одного текстового файла в другой, если он содержит определенный шаблон
  • awk-манипуляция файлом fasta
  • Удалите строки из файла до шаблона, если шаблон не существует
  • Как запустить grep в одном столбце?
  • Замените данные в столбце в файле данными в строке из другого файла
  • 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 
    Interesting Posts

    Остановить compiz из анимированного списка истории хрома?

    Установка CentOS 7 не использует все свободное пространство для PV

    Telnet для порта 80 не показывает результаты

    Выберите строки в одном файле на основе определенных значений во втором файле

    член группы не может записать файл с возможностью записи в группу с помощью reiserfs и расширенных списков ACL

    Как убить процесс, выполняемый в определенном скрипте

    kioclient KMimeTypeRepository :: родители: "/ usr / share / mime / subclasses" относится к неизвестному mimetype "application / vnd.ms-excel …"

    Как отображать символы ширины юникода в gnome-терминале и т.д.

    Как я могу регистрировать исходящий трафик TCP, включая полный путь к URL-адресам?

    Когда `ls -s` печатает" 0 "

    Что такое веб-сайт для программы `say`?

    Сократить путь в приглашении zsh

    Перемещение файлов и изменение прав собственности на время

    На `fork`, дочерних процессах и" подоболочках "

    Настройка маршрутизатора трафика (прокси?) Для производства

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