Dividir um arquivo .gz grande e gzipar cada arquivo dividido?

1

Eu tenho um arquivo text.gz grande (2 GB) e quero dividi-lo por linha. Eu tentei usar:

zcat text.gz | split -l1000000

No entanto, isso gerou um arquivo enorme (cerca de 92GB antes de eu terminá-lo) e colocar muita pressão sobre o disco rígido. É possível canalizá-lo em gzip on the fly?

    
por yumyai 18.04.2011 / 10:09

2 respostas

0

Isso pode ser feito melhor com um pequeno programa em perl.

Eu derrubei um aqui: ftp://ftp.sqsol.co.uk/pub/tools / zsplit /

Dê uma olhada e sinta-se à vontade para modificá-lo de acordo com suas necessidades pessoais.

    
por 18.04.2011 / 10:50
2

Aqui está um loop em torno de awk e gzip que dividirá um arquivo nos limites da linha e compactará as partes da seguinte forma:

# Generate files part0.dat.gz, part1.dat.gz, etc.
prefix="part"
count=0
suffix=".dat"

lines=10000 # Split every 10000 line.

zcat thefile.dat.gz |
while true; do
  partname=${prefix}${count}${suffix}

  # Use awk to read the required number of lines from the input stream.
  awk -v lines=${lines} 'NR <= lines {print} NR == lines {exit}' >${partname}

  if [[ -s ${partname} ]]; then
    # Compress this part file.
    gzip --best ${partname}
    (( ++count ))
  else
    # Last file generated is empty, delete it.
    rm -f ${partname}
    break
  fi
done

Para recriar o arquivo original, apenas zcat part*.dat.gz | gzip --best >thefile1.dat.gz . O arquivo compactado pode ter uma soma de verificação MD5 diferente do original, devido à variação das opções de compactação gzip usadas, mas os arquivos descompactados serão absolutamente idênticos.

    
por 10.09.2011 / 01:03

Tags