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?
command-line
unix
Vijay
quelle
quelle
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 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
.quelle
gzip
man sich unterscheidetcompress
, möchte mangzcat
.Dies scheint auch zu funktionieren - grep für die Anzahl der Zeilenenden in der Datei
quelle
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:
Das gab mir die Anzahl der Zeilen und die Datei, von der auf abwechselnden Zeilen mit 8 Prozessoren gezählt wurde. Es lief schnell!
quelle
for x in *.fastq.gz; do zcat "$x" | wc -l && echo $x; done
Verwenden Sie diesen Befehl:
Der Befehl
gzgrep
verhält sich wiegrep
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 $
.quelle
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:
dann ist die ungefähre Zeilenzahl
1000 * (size of $file) / (size of 1000-line-sample)
, solange Ihre Daten pro Zeile ziemlich homogen sind.quelle
gzip -cd <file.gz> | wc -l
Das hat bei mir funktioniert.
quelle