Eu sugiro fazer toda a manutenção dentro de awk
, isso funciona aqui com o GNU awk:
BEGIN { file = "1" }
{ print | "gzip -9 > " file ".gz" }
NR % 10000 == 0 {
close("gzip -9 > " file ".gz")
file = file + 1
}
Isso salvará 10000 linhas para 1.gz
, as próximas 10000 para 2.gz
, etc. Use sprintf
se você quiser mais flexibilidade na geração de nome de arquivo.
Atualizado com um teste
Os dados de teste usados são de até 300k, encontrados aqui .
wc -lc primes; md5sum primes
Saída:
25997 196958 primes
547d527ec50c2799fa6ce96dba3c26c0 primes
Agora, se o programa awk acima foi salvo em split.awk
e executado assim (com o GNU awk):
awk -f split.awk primes
Três arquivos (1.gz, 2.gz e 3.gz) são produzidos. Testando estes arquivos:
for f in {1..3}; do gzip -dc $f.gz >> foo; done
Teste:
diff source.file foo
A saída não deve ser nada se os arquivos forem os mesmos.
E os mesmos testes acima:
gzip -dc [1-3].gz | tee >(wc -lc) >(md5sum) > /dev/null
Saída:
25997 196958
547d527ec50c2799fa6ce96dba3c26c0 -
Isso mostra que o conteúdo é o mesmo e que os arquivos são divididos conforme o esperado.