se ho un file .gz su unix che ha un certo numero di linee. Come potrei contare le linee su unix senza decomprimerlo.
se ho un file .gz su unix che ha un certo numero di linee. Come potrei contare le linee su unix senza decomprimerlo.
Risposte:
Ovviamente non puoi contare i newline se il file è ancora compresso.
Ma puoi decomprimere in uno stream e contare le nuove righe in quello stream, senza mai scrivere il file (decompresso) su disco. Andrebbe qualcosa del genere:
zcat file.gz | wc -l
zcat per decompress e cat, wc per wordcount. Vedi le pagine man di entrambi se vuoi saperne di più.
MODIFICARE
Se non hai zcat, zcat è solo un altro nome per gunzip -c
.
gzip
si distingue compress
, si desidera gzcat
.
Anche questo sembra funzionare - grep per il numero di terminazioni di riga nel file
zgrep -Ec "$" file.gz
wc -l
Se vuoi farlo rapidamente, ti consiglio di usare 'pigz' (che IIRC sta per "Parallel Implementation of GZip"). Ho appena avuto una situazione simile in cui volevo contare il numero di righe in un mucchio di file gzip ed ecco la mia soluzione:
for x in *.gz; do unpigz -p 8 -c $x | wc -l && echo $x; done
Il che mi ha dato il numero di righe e il file da cui ha contato su righe alternate, usando 8 processori. Funzionò rapidamente!
for x in *.fastq.gz; do zcat "$x" | wc -l && echo $x; done
Usa questo comando:
gzgrep -c $ filename.gz
Il comando gzgrep
si comporta come grep
nei file compressi gzip. Decomprime il file al volo per la corrispondenza regex.
In questo caso -c
ordina al comando di produrre il numero di righe corrispondenti e il regex $
corrisponde alla fine della riga in modo che corrisponda a ogni riga o file.
Il risultato finale è identico a gzip -dc filename.gz | grep -c $
.
gzgrep
disponibile su sistemi diversi da Solaris?
Se stai bene con una stima approssimativa piuttosto che un conteggio esatto, e in realtà estrarre l'intero file o zgrepping per i finali di riga richiederebbe entrambi troppo tempo (che era la mia situazione proprio ora), puoi:
zcat "$file" | head -1000 > 1000-line-sample.txt
ls -ls 1000-line-sample.txt "$file"
quindi il conteggio approssimativo delle righe è 1000 * (size of $file) / (size of 1000-line-sample)
, purché i dati siano abbastanza omogenei per riga.