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?
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?
Antworten:
Sie können natürlich keine Zeilenumbrüche zählen, wenn die Datei noch komprimiert ist.
Sie können jedoch in einen 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.
BEARBEITEN
Wenn Sie nicht über zcat verfügen, ist zcat nur ein anderer Name für gunzip -c
.
gzip
man sich unterscheidet compress
, möchte man gzcat
.
Dies scheint auch zu funktionieren - grep für die Anzahl der Zeilenenden in der Datei
zgrep -Ec "$" file.gz
wc -l
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!
for x in *.fastq.gz; do zcat "$x" | wc -l && echo $x; done
Verwenden Sie diesen Befehl:
gzgrep -c $ filename.gz
Der Befehl gzgrep
verhält sich wie grep
bei komprimierten gzip-Dateien. Es dekomprimiert die Datei im laufenden Betrieb für den regulären Ausdruck.
In diesem Fall wird -c
der Befehl angewiesen, die Anzahl der übereinstimmenden Zeilen auszugeben, und der reguläre Ausdruck $
stimmt mit dem Zeilenende überein, sodass er mit jeder Zeile oder Datei übereinstimmt.
Das Endergebnis ist identisch mit gzip -dc filename.gz | grep -c $
.
gzgrep
es auf anderen Systemen als Solaris verfügbar?
Wenn Sie mit einer groben Schätzung anstatt einer exakten Zählung einverstanden sind und die gesamte Datei tatsächlich zu extrahieren oder sie für Zeilenenden zu zerkleinern, würde dies viel zu lange dauern (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.