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

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

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

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

  • Как запустить сложный awk-скрипт на удаленной машине?
  • Когда интерпретировать awk как команду или язык программирования?
  • Удалить строку, содержащую первое появление «pattern1» после последнего появления «pattern2»?
  • замените символ из строки, которая находится между первым и вторым поиском, используя sed или awk
  • awk условие true и false
  • Поиск среднего количества строк в файле
  • В качестве примера, начальными критериями будут «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 

  • Обработка сводной таблицы из командной строки
  • Как применить одно и то же действие awk к различным файлам?
  • sed, чтобы заменить строку из одного файла на все содержимое другого файла
  • Заменить значения из файла1 в файл2 awk
  • Добавление входного файла с awk после шаблона (цикл?)
  • Вставьте новую строку после разбитой последовательности чисел awk / unix / shell scripting
  • 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/ '{*}' 
    Linux и Unix - лучшая ОС в мире.