Dividir el archivo en varios archivos según el patrón

Dividir el archivo en varios archivos según el patrón

Tengo un archivo grande que tiene un par de cientos de líneas. Este archivo está dividido en muchas partes mediante un identificador específico, digamos "ABC". Esta línea 'ABC' aparece 6 veces, así que quiero 6 archivos de salida. Estoy familiarizado con split y awk pero parece que no puedo crear una línea de comando que haga lo que he descrito, ¿alguna idea?

Aquí hay un ejemplo

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

Me gustaría tener tres archivos donde ABC sea la primera línea del nuevo archivo y termine antes de encontrar el siguiente ABC.

Respuesta1

Usandocsplit

csplit -z somefile /ABC/ '{*}'

Los archivos de salida serán xx00, xx01, ... de forma predeterminada, pero puede cambiar el formato y la numeración si lo desea; consulteman csplit

Respuesta2

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

Lo anterior dividirá el archivo según lo solicitado sin importar cuántas instancias de la línea del marcador tenga, y luego eliminará el marcador de los archivos resultantes. Los archivos de salida se llamarán, por ejemplo splitfile_00, splitfile_01, etc.

Separando ese bit al final de la csplitinvocación: "{$(($(grep -c $NEEDLE HAYSTACK)-1))}"Usamos el subshell greppara obtener el número de instancias de su marcador dentro del archivo y restar uno; esto indica csplitexactamente cuántas divisiones se realizará.

Tenga en cuenta que, tal como está escrito, las cosas pueden salir mal si su marcador aparece dentro de los datos.

información relacionada