E aqui está uma frase simples e simples:
$ gawk '/^\[/{match($0, /^\[ (.+?) \]/, k)} {print >k[1]".txt" }' entry.txt
Isso funcionará para qualquer tamanho de arquivo, independentemente do número de linhas em cada entrada, desde que cada cabeçalho de entrada se pareça com [ blahblah blah blah ]
. Observe o espaço logo após a abertura [
e pouco antes do fechamento ]
.
EXPLICAÇÃO:
awk
e gawk
leem um arquivo de entrada linha a linha. Conforme cada linha é lida, seu conteúdo é salvo na variável $0
. Aqui, estamos dizendo gawk
para corresponder a qualquer coisa entre colchetes e salvar sua correspondência na matriz k
.
Assim, toda vez que a expressão regular for correspondida, ou seja, para cada cabeçalho no seu arquivo, k [1] terá a região correspondente da linha. Ou seja, "entry1", "entry2" ou "entry3" ou "entryN".
Finalmente, imprimimos cada linha em um arquivo chamado <whatever value k currently has>.txt
, ie entry1.txt, entry2.txt ... entryN.txt.
Este método será muito mais rápido que o perl para arquivos maiores.