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.
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?
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.