Dividir o arquivo gz e descomprimir individualmente [duplicado]

3

Eu tenho um grande arquivo .gz, que é 2,6 GB por si só. Não consigo descompactar devido à limitação de tamanho. O arquivo é um único arquivo de texto grande. Eu não estou sendo capaz de descomprimi-lo completamente devido à limitação de tamanho. Eu quero dividir em 10 partes individuais e descomprimir cada uma individualmente para que eu possa 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

    
por Noor 16.04.2017 / 15:49

2 respostas

9

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.

    
por 16.04.2017 / 16:09
4

Bem, split terá prazer em dividir as coisas para você de várias maneiras.

Para criar 10 partes individuais, você precisa saber o tamanho do arquivo descompactado. O seguinte deve dar a você arquivos com aproximadamente 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 esses arquivos grandes. Então, dependendo do que você realmente quer fazer com isso, você pode querer fazer divisões menores. Ou apenas deixe-o como gz , funciona bem o suficiente para zgrep e outras ferramentas, mesmo que tenha que ser descompactado a cada vez.

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

    
por 16.04.2017 / 16:08

Tags