it-swarm.com.de

Zeilen in einer komprimierten Datei zählen

wenn ich eine .gz-Datei unter Unix habe, die eine bestimmte Anzahl von Zeilen hat. Wie könnte ich die Zeilen unter Unix zählen, ohne sie zu dekomprimieren?.

37
Vijay

Sie können natürlich keine Zeilenumbrüche zählen, wenn die Datei noch komprimiert ist.

Sie können jedoch zu einem Stream dekomprimieren und die Zeilenumbrüche in diesem Stream zählen, ohne die (dekomprimierte) Datei jemals auf die Festplatte schreiben zu müssen. Das würde ungefähr so ​​gehen:

zcat file.gz | wc -l

zcat zum dekomprimieren & cat, wc für wordcount. Weitere Informationen finden Sie in den Manpages zu beiden.

EDIT

Wenn Sie nicht über zcat verfügen, ist zcat nur ein anderer Name für gunzip -c.

55
extraneon

Dies scheint auch zu funktionieren - grep für die Anzahl der Zeilenenden in der Datei

zgrep -Ec "$" file.gz
7
Patrick Wright

Wenn Sie es schnell erledigen möchten, empfehle ich die Verwendung von 'pigz' (wobei IIRC für "Parallel Implementation of GZip" steht). Ich hatte gerade eine ähnliche Situation, in der ich die Anzahl der Zeilen in einer Reihe von gzip'ed-Dateien zählen wollte, und hier war meine Lösung:

for x in *.gz; do unpigz -p 8 -c $x | wc -l && echo $x; done

Das gab mir die Anzahl der Zeilen und die Datei, von der auf abwechselnden Zeilen mit 8 Prozessoren gezählt wurde. Es lief schnell!

5
peter

Verwenden Sie diesen Befehl:

gzgrep -c $ filename.gz

Der Befehl gzgrep verhält sich wie grep, jedoch in komprimierten gzip-Dateien. Es dekomprimiert die Datei im laufenden Betrieb für den regulären Ausdruck.

In diesem Fall weist -c den Befehl an, die Anzahl der übereinstimmenden Zeilen auszugeben, und der reguläre $ stimmt mit dem Zeilenende überein, sodass er mit jeder Zeile oder Datei übereinstimmt.

Das Endergebnis ist identisch mit gzip -dc filename.gz | grep -c $.

2
Ravi K M

Wenn Sie mit einer groben Schätzung anstatt einer exakten Zählung einverstanden sind und das Extrahieren der gesamten Datei oder das Zerlegen der Datei auf Zeilenenden viel zu lange dauern würde (was gerade meine Situation war), können Sie:

zcat "$file" | head -1000 > 1000-line-sample.txt
ls -ls 1000-line-sample.txt "$file"

dann ist die ungefähre Zeilenzahl 1000 * (size of $file) / (size of 1000-line-sample), solange Ihre Daten pro Zeile ziemlich homogen sind.

1
James