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

В предыдущем ответе я нашел следующий 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 

  • разрезать с помощью 2-символьного разделителя
  • Объединить и добавить столбцы для более чем двух файлов
  • Awk с несколькими разделителями
  • Получить определенную строку ниже строки grepped
  • Используйте sed для поиска и сохранения только строк с двумя альфа-символами в них
  • проанализировать файл журнала, который принимает аргумент (время выполнения тестов)
  • Автоматически загружать пользовательскую функцию при запуске с помощью awk?
  • Объединение двух разных файлов с условиями
  • 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/ '{*}' 
    Interesting Posts

    Как установить последнюю версию Eclipse через терминал

    Как сделать grep, даже если файл отсутствует?

    Xmove не может подключиться к серверу X11 через пересылку SSH X

    Переменные среды не устанавливаются, когда моя функция вызывается в конвейере

    Загрузка DVD KNOPPIX для вывода из командной строки grub

    Является ли xkcd универсальный установочный скрипт хорошей идеей?

    Постоянно менять адрес Mac внутри / etc / network / interfaces

    grub2-mkconfig не показывает Windows

    Символ ссылки на разрешение каталогов запрещен

    Используйте imagemagick для преобразования непрозрачного цвета в альфа

    Гостевая виртуальная машина Linux на хосте Mac – клавиатура

    экспортировать HTTP_PROXY и специальные символы в passwd

    Есть ли способ использовать консольные (мошеннические) режимы только для части экрана терминала?

    Как разрешить запуск сценария кем угодно в любом месте

    Мош и терминальное мультиплексирование

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