Ich habe eine große gzip'd Textdatei. Ich möchte etwas wie:
zcat BIGFILE.GZ | \
awk (snag 10,000 lines and redirect to...) | \
gzip -9 smallerPartFile.gz
Der awk-Teil dort oben soll im Grunde genommen 10.000 Zeilen dauern und an gzip senden und dann wiederholen, bis alle Zeilen in der ursprünglichen Eingabedatei verbraucht sind. Ich habe ein Skript gefunden, das behauptet, dies zu tun, aber wenn ich es auf meinen Dateien ausführe und dann das Original von denjenigen unterscheide, die geteilt und dann zusammengeführt wurden, fehlen Zeilen. Also stimmt etwas mit dem awk-Teil nicht und ich bin mir nicht sicher, welcher Teil kaputt ist.
Das Ziel:
- Lesen Sie die Quelldatei einmal für den gesamten Vorgang durch
- Teilen Sie die Quelle in kleinere Teile auf, die durch Zeilenumbrüche begrenzt sind. Angenommen, 10.000 Zeilen pro Datei
- Komprimieren Sie die Zieldateien, die als Ergebnis der Aufteilungsaktion erstellt wurden, und tun Sie dies ohne einen zusätzlichen Schritt, nachdem dieses Skript verarbeitet wurde.
Hier ist der Code. Kann mir jemand sagen, warum dies keine Datei ergibt, die geteilt und zusammengeführt und dann erfolgreich zum Original verschoben werden kann?
# Generate files part0.dat.gz, part1.dat.gz, etc.
# restore with: zcat foo* | gzip -9 > restoredFoo.sql.gz (or something like that)
prefix="foo"
count=0
suffix=".sql"
lines=10000 # Split every 10000 line.
zcat /home/foo/foo.sql.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 -9 ${partname}
(( ++count ))
else
# Last file generated is empty, delete it.
rm -f ${partname}
break
fi
done