GZ-Datei aufteilen und einzeln dekomprimieren

GZ-Datei aufteilen und einzeln dekomprimieren

Ich habe eine große .gz-Datei, die allein schon 2,6 GB groß ist. Ich kann sie aufgrund der Größenbeschränkung nicht entpacken. Die Datei ist eine einzelne große Textdatei. Aufgrund der Größenbeschränkung kann ich sie nicht vollständig entpacken. Ich möchte sie in sagen wir 10 einzelne Teile aufteilen und jeden einzeln entpacken, damit ich jede einzelne Datei verwenden kann:

Meine Fragen sind:

  1. Ist das möglich ?
  2. Außerdem, als Teil der Antwort, ob die Befehle auch bereitgestellt werden können, da ich mit diesen Befehlen nicht sehr vertraut bin

Danke

Antwort1

Das gzipKomprimierungsformat unterstützt das Dekomprimieren einer Datei, die aus mehreren kleineren komprimierten Dateien zusammengesetzt wurde (die dekomprimierte Datei enthält dann die zusammengesetzten dekomprimierten Daten), es unterstützt jedoch nicht das Dekomprimieren einer zerteilten komprimierten Datei.

Angenommen, Sie möchten am Ende einen „Ausschnitt“ der dekomprimierten Daten haben, können Sie dies umgehen, indem Sie die dekomprimierten Daten ddmehrere Male eingeben und dabei jedes Mal einen anderen Ausschnitt der dekomprimierten Daten zum Speichern in einer Datei auswählen und den Rest verwerfen.

Hier verwende ich eine kleine Beispiel-Textdatei. Ich dekomprimiere sie wiederholt (wasWilledauert bei großen Dateien etwas), und jedes Mal wähle ich einen 8-Byte-Ausschnitt aus den dekomprimierten Daten. Sie würden dasselbe tun, aber einen viel größeren Wert für bs(„Blockgröße“) verwenden.

$ 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

(usw.)

Verwenden Sie eine bsEinstellung, die etwa ein Zehntel derunkomprimiertDateigröße und erhöht sich in jeder Iteration skipvon 0 um eins.


UPDATE: Der Benutzer wollte die Anzahl der Zeilen in den unkomprimierten Daten zählen (siehe Kommentare zur Frage). Dies lässt sich leicht erreichen, ohne dass Teile der unkomprimierten Daten auf der Festplatte gespeichert werden müssen:

$ gunzip -c file.gz | wc -l

gunzip -cdekomprimiert die Datei und schreibt die unkomprimierten Daten in die Standardausgabe. Das wcDienstprogramm mit dem -lFlag liest aus diesem Stream und zählt die Anzahl der gelesenen Zeilen.

Antwort2

Nun, splitich teile die Dinge gerne auf verschiedene Arten für Sie auf.

Um 10 einzelne Teile herzustellen, müssen Sie die Größe der unkomprimierten Datei kennen. Im Folgenden erhalten Sie Dateien mit einer Größe von jeweils etwa 1 GiB.

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

1 GB ist immer noch viel für eine Textdatei, viele Editoren können mit so großen Dateien schlecht umgehen. Je nachdem, was Sie wirklich damit machen wollen, sollten Sie also kleinere Aufteilungen vornehmen. Oder lassen Sie es einfach so gz, es funktioniert gut genug für zgrepund andere Tools, auch wenn es jedes Mal dekomprimiert werden muss.

Wenn es sich um eine Protokolldatei handelt, möchten Sie möglicherweise Ihre Protokollrotation feinabstimmen, um auf natürliche Weise kleinere Teilungen zu erzeugen.

verwandte Informationen