Tengo un archivo de registro que me gustaría dividir en varios archivos
Tabla de contenido
*** Configuration Database
*** Logs
*** Configuration Logs
*** Query Logs
.
.
and so on
El problema es que los títulos de la sección aparecen nuevamente en el cuerpo con los datos o registros apropiados entre las secciones, por lo que tendría que buscar la segunda instancia de cada título y copiar los datos hasta la segunda instancia del siguiente título.
Cuerpo
*** Configuration Database
(Data/Logs)
*** Logs
(Data/Logs)
*** Configuration Logs
(Data/Logs)
*** Query Logs
(Data/Logs)
Básicamente, me gustaría tomar el archivo de texto de depuración, ejecutar un script en él y dividir el archivo en muchos archivos de texto, uno para cada sección de la tabla de contenido, manteniendo el original intacto. Entonces, básicamente tendría debug.txt, Configuration Database.txt, Logs.txt, etc., cada uno con todos los datos en cada sección, hasta el momento en que comienza la nueva sección. Cualquier ayuda sería muy apreciada, ya que esto se me escapa un poco :)
Respuesta1
Prueba esto:
awk '/^[*][*][*] /{ if ($0 in seen) fname=$0; else seen[$0];} fname{print>fname}' file
Cómo funciona
awk lee implícitamente un archivo línea por línea. Para cada línea leída, hacemos lo siguiente:
/^[*][*][*] /{ if ($0 in seen) fname=$0; else seen[$0];}
Para cualquier línea que comience con tres estrellas y un espacio, verificamos si hemos visto esa línea antes. Si es así, nos fijamos
fname
en esa línea. De lo contrario, actualizamos la matriz asociativaseen
para indicar que hemos visto esta línea una vez.fname{print>fname}
Si
fname
es un valor que no está vacío, escriba la línea actual en el archivo denominadofname
.