Разделить файл на несколько файлов на основе шаблона

У меня большой файл длиной в несколько сотен строк. Этот файл разделен на многие части с помощью определенного идентификатора, позволяет сказать «ABC». Эта строка «ABC» появляется 6 раз, поэтому я хочу 6 выходных файлов. Я знаком с split и awk, но не могу создать командную строку, которая будет делать то, что я описал, любые идеи?

Вот пример

ABC line 1 line 2 line 3 ABC line 1 line 2 ABC line1 

Я хотел бы три файла, где ABC – первая строка в новом файле, и заканчивается до появления следующей ABC.

 NEEDLE=ABC HAYSTACK=/path/to/bigfile csplit -f splitfile_ $HAYSTACK /$NEEDLE/ "{$(($(grep -c $NEEDLE HAYSTACK)-1))}" for file in splitfile_*; do sed --in-place "s/$NEEDLE//" $file done 

Вышеизложенное будет разбивать файл по запросу независимо от того, сколько экземпляров линии маркера у вас есть, а затем удалить маркер из результирующих файлов. Выходные файлы будут называться, например, splitfile_00 , splitfile_01 и т. Д.

Выделив этот бит в конце вызова csplit : "{$(($(grep -c $NEEDLE HAYSTACK)-1))}" : Мы используем подоболочку grep для получения количества экземпляров вашего маркера в файле , и вычитаем один – это говорит csplit точно, сколько будет расколов, которые он собирается делать.

Обратите внимание, что, как написано, все может выглядеть грушевидно, если ваш маркер появляется в данных.

Использование csplit

 csplit -z somefile /ABC/ {*} 

Выходными файлами будут xx00 , xx01 , … по умолчанию, но при желании вы можете изменить формат и нумерацию – см. man csplit