
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 csplit
invocación: "{$(($(grep -c $NEEDLE HAYSTACK)-1))}"
Usamos el subshell grep
para obtener el número de instancias de su marcador dentro del archivo y restar uno; esto indica csplit
exactamente 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.