Divida o arquivo gz e descompacte individualmente

Divida o arquivo gz e descompacte individualmente

Eu tenho um grande arquivo .gz, que tem 2,6 GB. Não consigo descompactá-lo devido à limitação de tamanho. O arquivo é um único arquivo de texto grande. Não estou conseguindo descompactá-lo completamente devido à limitação de tamanho. Quero dividi-lo em, digamos, 10 partes individuais e descompactar cada uma individualmente para poder usar cada arquivo individual:

Minhas perguntas são:

  1. Isso é possível ?
  2. Além disso, como parte da resposta, se os comandos também puderem ser fornecidos, pois não sou muito versado nesses comandos

Obrigado

Responder1

O gzipformato de compactação suporta a descompactação de um arquivo que foi concatenado a partir 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 ddvá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 descompactando-o repetidamente (o quevaidemora um pouco para arquivos grandes) e cada vez eu escolho uma fatia de 8 bytes dos dados descompactados. Você faria o mesmo, mas usaria um valor muito maior para bs("tamanho do 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 bsconfiguração que seja cerca de um décimo dodescompactadotamanho do arquivo e em cada iteração aumenta skipde 0 em um.


ATUALIZAÇÃO: O usuário deseja contar o número de linhas nos dados descompactados (ver comentários anexados à pergunta). Isso é feito facilmente sem a necessidade de armazenar qualquer parte dos dados descompactados no disco:

$ gunzip -c file.gz | wc -l

gunzip -cirá descompactar o arquivo e gravar os dados descompactados na saída padrão. O wcutilitário com o -lsinalizador lerá esse fluxo e contará o número de linhas lidas.

Responder2

Bem, splitficarei feliz em dividir as coisas para você de várias maneiras.

Para fazer 10 partes individuais, você precisa saber o tamanho do arquivo descompactado. O seguinte deve fornecer arquivos com cerca de 1 GiB de tamanho cada.

gunzip < bigfile.gz | split --line-bytes=1G - bigfile-split

1G ainda é muito para um arquivo de texto, muitos editores lidam mal com arquivos tão grandes. Portanto, dependendo do que você realmente deseja fazer com isso, você pode optar por divisões menores. Ou apenas deixe como gzfunciona bem para zgrepoutras ferramentas, mesmo que precise ser descompactado todas as vezes.

Se este for um arquivo de log, você pode querer ajustar a rotação do log para produzir divisões menores naturalmente.

informação relacionada