Eu tenho um arquivo de log que gostaria de dividir em vários arquivos
Índice
*** Configuration Database
*** Logs
*** Configuration Logs
*** Query Logs
.
.
and so on
O problema é que os títulos da seção aparecem novamente no corpo com os dados ou registros apropriados entre as seções, então eu teria que procurar a segunda instância de cada título e copiar os dados até a segunda instância do próximo título.
Corpo
*** Configuration Database
(Data/Logs)
*** Logs
(Data/Logs)
*** Configuration Logs
(Data/Logs)
*** Query Logs
(Data/Logs)
Basicamente, eu gostaria de pegar o arquivo de texto de depuração, executar um script nele e dividir o arquivo em vários arquivos de texto, um para cada seção do Índice, mantendo o original intacto. Então, eu basicamente teria debug.txt, Configuration Database.txt, Logs.txt, etc, cada um com todos os dados de cada seção, até o início da nova seção. Qualquer ajuda seria muito apreciada, pois isso está um pouco além da minha cabeça :)
Responder1
Experimente isto:
awk '/^[*][*][*] /{ if ($0 in seen) fname=$0; else seen[$0];} fname{print>fname}' file
Como funciona
awk lê implicitamente um arquivo linha por linha. Para cada linha lida, fazemos o seguinte:
/^[*][*][*] /{ if ($0 in seen) fname=$0; else seen[$0];}
Para qualquer linha que comece com três estrelas e um espaço, verificamos se já vimos essa linha antes. Se tivermos, definimos
fname
essa linha. Caso contrário, atualizamos o array associativoseen
para indicar que vimos esta linha uma vez.fname{print>fname}
Se
fname
for um valor não vazio, escreva a linha atual no arquivo chamadofname
.