Wie füge ich eine Zeile in eine komprimierte Datei ein, ohne sie zu entpacken?

8
mknod /tmp/oracle.pipe p

sqlplus / as sysdba << _EOF
set escape on

host nohup gzip -c < /tmp/oracle.pipe > /tmp/out1.gz \&
spool /tmp/oracle.pipe
select * from employee;
spool off

_EOF

rm /tmp/oracle.pip

Ich muss einen Trailer am Ende der komprimierten Datei out1.gz einfügen, ich kann die Zeilen mit zählen

count=zcat out1.gz |wc -l

Wie setze ich den Anhänger ein?

T5 (assuming count=5)

Am Ende von out1.gz ohne es zu entpacken.

Rishi Deorukhkar
quelle
Verstehe ich Sie richtig: Sie möchten einer komprimierten Datei eine Textzeile hinzufügen?
Fiximan
Ja, ohne die Datei zu entpacken
Rishi Deorukhkar
1
i) count=zcat out1.gz |wc -lwird nicht funktionieren, du brauchst so etwas wie count=$(zcat out1.gz |wc -l); ii) zcat wird Entpacken Sie die Datei, wenn Sie bereit sind , das zu tun, warum Sie nicht zu unzip wan? iii) Warum zählst du nicht die Zeilen und fügst die Zahl hinzu, bevor du die Datei überhaupt komprimierst?
Terdon
Übrigens heißt "am Ende einfügen" "anhängen", was genau die akzeptierte Antwort ist. Vielleicht solltest du den Titel bearbeiten.
Dmitry Grigoryev

Antworten:

18

Aus können man gzipSie lesen, dass gzipped-Dateien einfach verkettet werden können:

ERWEITERTE NUTZUNG Mehrere komprimierte Dateien können verkettet werden. In diesem Fall extrahiert gunzip alle Mitglieder gleichzeitig. Zum Beispiel:

        gzip -c file1  > foo.gz
        gzip -c file2 >> foo.gz

  Then

        gunzip -c foo

  is equivalent to

         cat file1 file2

Dies kann auch catfür die gzipped-Dateien erfolgen, z.

seq 1 4 > A && gzip A
echo 5 > B && gzip B
#now 1 to 4 is in A.gz and 5 in B.gz, we want 1 to 5 in C.gz:
cat A.gz B.gz > C.gz && zcat C.gz
1
2
3
4
5
#or for appending B.gz to A.gz:
cat B.gz >> A.gz

Gehen Sie wie folgt vor, um auf eine externe Datei zu verzichten, die angehängt werden soll:

echo "this is the new line" | gzip - | cat - >> original_file.gz
Fiximan
quelle
Dies kann für Ihr einfaches Beispiel funktionieren, da kaum etwas zu komprimieren ist. Versuchen Sie es jetzt mit komplexeren Linien, die überlappende Teilzeichenfolgen enthalten.
Murphy
Schien mit dem Hinzufügen von "Hallo" zu einer meiner Lebenslauf-Dateien zu funktionieren, die von einer Größe von 400 KB auf 100 KB komprimiert wurden. Aber ich weiß nicht, wie die Komprimierung gzipfunktioniert und ob etwas beschädigt werden könnte. Bisher waren einige Textdateien, die ich ausprobiert habe, in Ordnung.
Fiximan
Scheint so, als würde dies tatsächlich funktionieren. Der blinde Fleck war auf meiner Seite: stackoverflow.com/questions/8005114/…
Murphy
@ Murphy danke für die Klarstellung - Ich habe dies zuvor verwendet und Sie haben mir Sorgen um meine vorherigen Daten gemacht
Fiximan
Aus Ihrem Text ging nicht hervor, ob Sie diese Lösung gerade erfunden haben. Es tut mir leid für die Ablehnung und ich möchte sie zurücksetzen, aber leider ist die Abstimmung jetzt gesperrt, bis Sie die Antwort bearbeiten - eine weitere Besonderheit von U & L?
Murphy
2

Wie groß ist Ihr Mitarbeitertisch? Wenn Sie nicht eine Million Mitarbeiter haben und jeder Datensatz Tausende von Bytes benötigt, lohnt es sich wahrscheinlich nicht einmal, die Ausgabe zu komprimieren.

Es lohnt sich mit ziemlicher Sicherheit nicht, sie zu komprimieren, während die Ausgabedatei erstellt wird. Warum also nicht einfach in unkomprimierten Nur-Text ausgeben, ausführen count=$(wc -l out1) ; echo "T$count" >> out1und dann komprimieren gzip out1?

Alternativ können Sie auch eine Variation von select count(*) from employeevor dem spool offBefehl ausführen .

cas
quelle
Die Tabelle hat 2 Millionen Datensätze und unkomprimierter Extrakt ist ungefähr 2 GB
groß, hat
1

Ich hatte mit einer ähnlichen Herausforderung zu kämpfen: ein paar Zeilen an einen komprimierten SQL-Dump anzuhängen. Meine Lösung basierte auf der Antwort von @Fiximan

echo 'append this string' | gzip >> out.gz
TimmyG
quelle