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

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 
  • Насколько хорошо работает grep / sed / awk на очень больших файлах?
  • Присоедините два файла на основе столбца
  • Замените данные в столбце в файле данными в строке из другого файла
  • удалить пустые строки в awk-дисплее
  • Как печатать самую длинную строку в файле?
  • замените значения полей в каждой строке значениями в предыдущих полях до конца каждой строки
  • файлы списка tar, перерыв в первом файле
  • Как я могу написать во вторую строку файла из командной строки?
  • Заменить текст между скобками
  • Должен быть лучший способ заменить одиночные новые строки?
  • Удалять пробелы между двумя словами ТОЛЬКО
  • Interesting Posts

    восстановить файлы с локального файлового сервера

    Как отредактировать файл и сохранить его список управления доступом / контекст безопасности SELinux?

    Как я могу показать, сколько строк позиций переместилось в diff-выход?

    Обмен одной колонки из файла1 с файлами из файла2

    Правильные параметры для openssl с простым зашифрованным текстом

    X.org отсутствующие шрифты

    ftp: на удаленном компьютере изменения владельца файла с изменением имени пользователя, используемого для входа в удаленную машину

    Хорошо ли использовать tail -f в больших файлах журнала?

    Запустить исполняемый файл с помощью xdg-open

    Измерение задержки в конвейере GStreamer

    vim / gvim не удается разместить буфер обмена X11 в регистре «+» или «*»?

    Lm_sensors не читает температуру карты gfx вправо

    Скрипт для проверки использования файловой системы и свободного пространства

    Можно ли изменить привязку ключа для завершения в оболочке bash?

    Подключение Kali к Интернету

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