Разделить файл по шаблону, сохраняя только фрагменты, содержащие второй шаблон

В предыдущем ответе я нашел следующий awk-скрипт для разделения больших файлов на более мелкие части на основе шаблона (заменяя «строку заголовка» другим шаблоном). Тем не менее, мне нужно принять его еще больше, поскольку могут быть созданы миллионы частей, но если я смогу снова фильтровать их, он получит то, что мне нужно.

awk ' /header-line/ {++part} {print >sprintf("part-%03d.txt", part)} ' 

Возможно ли допросить каждую «часть» до или после того, как она будет записана, чтобы проверить, существует ли какой-то шаблон в части и только написать эту часть на соответствие для дополнительного шаблона.

В качестве примера, начальными критериями будут «ID:» (верхняя строка выше). Затем я хочу искать каждую «часть», созданную для определенного имени метода; назовите его «searchForThisMethod» в качестве строки для поиска, которая может быть в разных местах в части.

Пример ввода:

 ID: 1 bb bb bb bb secondaryCheck ID: 2 b b b b b b b b ID: 3 h h h h h secondaryCheck g g g g 

One Solution collect form web for “Разделить файл по шаблону, сохраняя только фрагменты, содержащие второй шаблон”

Вы можете разбить файл, а затем запустить grep -q some_method на каждой части и удалить его, если false, например

 for file in part-*.txt; do grep -q some_method "$file" if [ $? -ne 0 ] then rm "$file" fi done 

или
используйте два прохода – удалив из ввода «части», которые содержат some_method затем разделили результат, например, с помощью sed для первого прохода и вашего awk кода для второго прохода:

 sed -e '1{h;d;}' -e '/ID/!{H;$!d;}' -e 'x;/some_method/!d' infile | \ awk '/ID/{++part}{print > sprintf("part-%03d.txt", part)}' 

sed копирует 1-ю строку над старым буфером h и d eletes добавляет каждую строку, которая не соответствует ID в старый буфер H , удаляет ее, если это не последняя строка, а e x изменяет буферы на строках, которые соответствуют ID удаляющему шаблон если он не содержит some_method . Затем результат передается на awk . Если вы получаете too many open files ошибок too many open files вам придется close() файлы:

 sed -e '1{h;d;}' -e '/ID/!{H;$!d;}' -e 'x;/some_method/!d' infile | \ awk '/ID/{++part}{close(fn);fn=sprintf("part-%03d.txt", part);print >> fn}' 

или, если вы используете gnu / anything, вы можете использовать csplit вместо awk :

 sed '1{h;d};/ID/!{H;$!d};x;/some_method/!d' infile | \ csplit -f 'part-' -b '%03d.txt' -sz - /ID/ '{*}' 
  • Как найти номер строки в файле с разделителями, который имеет <20 символов?
  • Добавить символ перед любой буквой
  • Объединение полей из строк с различным количеством полей
  • Сравнивая File1 и File2, чтобы прокомментировать соответствующий шаблон в File2
  • Группируйте все строки на основе первого столбца, затем вычислите общее количество второго и третьего столбцов
  • ошибка в awk / sed использование манипуляций с файлами по очереди
  • Необходимо найти время отклика, которое занимает от 1-3 секунд в журналах Apache
  • Каким образом можно фильтровать текстовый файл для удаления пустых строк?
  • awk не работает с qsub
  • Замените данные в столбце в файле данными в строке из другого файла
  • Как перебирать файлы с помощью awk, bash или ruby?
  • make awk напечатать строку, соответствующую переменной и следующим n строкам, и использовать переменную в awk
  • Interesting Posts

    Запуск dd. Почему ресурс занят?

    Запустить специальную команду из .desktop с корневым

    О взаимосвязи между инициализацией оболочки и настольными приложениями после «графического входа»

    Как написать программу, которая может работать на компьютере без операционной системы?

    Есть ли эквивалент для vim \ zs в sed или perl?

    Расширение общей памяти MIT или MIT-SHM над ssh

    Что делает `mv ./*` без указания адресата?

    Crontab не работает

    как предотвратить перезагрузку nfsmount?

    `mv` потерпел неудачу из-за недостаточного дискового пространства, что теперь?

    Печать в командной строке с использованием принтера Samba, требующего аутентификации

    Создайте собственный брандмауэр на Java или другом языке высокого уровня?

    Как я могу перейти вверх или вниз в tmux с помощью Terminal.app?

    Вставьте отсутствующую строку в несколько упорядоченных столбцов

    pssh (Parallel-ssh), передающий разные параметры для каждого хоста

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