Tengo un archivo de registro que me gustaría dividir en varios archivos según el contenido.

Tengo un archivo de registro que me gustaría dividir en varios archivos según el contenido.

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 fnameen esa línea. De lo contrario, actualizamos la matriz asociativa seenpara indicar que hemos visto esta línea una vez.

  • fname{print>fname}

    Si fnamees un valor que no está vacío, escriba la línea actual en el archivo denominado fname.

información relacionada