O formato de compactação gzip
suporta a descompactação de um arquivo que foi concatenado de vários arquivos compactados menores (o arquivo descompactado conterá os dados descompactados concatenados), mas não suporta a descompactação de um arquivo compactado cortado.
Supondo que você queira acabar com uma "fatia" dos dados descompactados, você pode contornar isso alimentando os dados descompactados em dd
várias vezes, cada vez selecionando uma fatia diferente dos dados descompactados para salvar em um arquivo e descartando o resto.
Aqui estou usando um pequeno arquivo de texto de exemplo. Estou repetidamente descomprimindo-a (o que irá demorar um pouco para arquivos grandes), e cada vez que eu seleciono uma fatia de 8 bytes dos dados descompactados. Você faria o mesmo, mas usaria um valor muito maior para bs
("tamanho de bloco").
$ cat file
hello
world
1
2
3
ABC
$ gzip -f file # using -f to force compression here, since the example is so small
$ gunzip -c file.gz | dd skip=0 bs=8 count=1 of=fragment
1+0 records in
1+0 records out
8 bytes transferred in 0.007 secs (1063 bytes/sec)
$ cat fragment
hello
wo
$ gunzip -c file.gz | dd skip=1 bs=8 count=1 of=fragment
1+0 records in
1+0 records out
8 bytes transferred in 0.000 secs (19560 bytes/sec)
$ cat fragment
rld
1
2
(etc.)
Use uma configuração bs
que seja aproximadamente um décimo do tamanho do arquivo descompactado e, em cada iteração, aumente skip
de 0 para um.
UPDATE: O usuário queria contar o número de linhas nos dados não compactados (veja os comentários anexados à pergunta). Isso é facilmente realizado sem ter que armazenar qualquer parte dos dados descompactados no disco:
$ gunzip -c file.gz | wc -l
gunzip -c
descompactará o arquivo e gravará os dados não compactados na saída padrão. O utilitário wc
com o sinalizador -l
lerá esse fluxo e contará o número de linhas lidas.