E aqui está uma frase simples e simples:
$ gawk '{if(match($0, /^\[ (.+?) \]/, k)){name=k[1]}} {print >name".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 ao awk para combinar 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". name=k[1]
apenas salva o valor de k [1] (a correspondência) em uma nova variável name
.
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.
Não posso garantir isso, pois nunca usei o shell do Windows, mas estou disposto a apostar que ele será muito mais rápido do que isso também. Gawk / awk são RÁPIDOS.