contare le righe in un file compresso


Risposte:


61

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.


7
Su Unices dove gzipsi distingue compress, si desidera gzcat.
Coneslayer il

7

Anche questo sembra funzionare - grep per il numero di terminazioni di riga nel file

zgrep -Ec "$" file.gz

Questo dà una risposta diversa (molto più alta) per me rispetto alle convocazioni awc -l
Stop Harming Monica

5

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!


1
O se unpigz non è disponibile, semplicemente confor x in *.fastq.gz; do zcat "$x" | wc -l && echo $x; done
Calimo

2

Usa questo comando:

gzgrep -c $ filename.gz

Il comando gzgrep si comporta come grepnei 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 $.


È gzgrepdisponibile su sistemi diversi da Solaris?
pabouk,

1
No. Su altri sistemi, il comando sarebbe zgrep -c $ nomefile.gz
Ravi KM

1
Sebbene si possa pensare intuitivamente che sia meglio di zcat + wc, quando li cronometro, impiegano la stessa quantità di tempo.
ngọcminh.oss,

1

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.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.