policz linie w skompresowanym pliku

Odpowiedzi:

60

Oczywiście nie można liczyć nowych linii, jeśli plik jest nadal skompresowany.

Ale możesz rozpakować do strumienia i policzyć nowe wiersze w tym strumieniu, bez zapisywania pliku (rozpakowanego) na dysk. To by wyglądało mniej więcej tak:

zcat file.gz | wc -l

zcat dla dekompresji i cat, wc dla wordcount. Zobacz strony podręcznika dla obu, jeśli chcesz dowiedzieć się więcej.

EDYTOWAĆ

Jeśli nie masz Zcat, Zcat to tylko inna nazwa gunzip -c.


źródło
7
Na Unices, gdzie gzipróżni się compress, chcesz gzcat.
coneslayer
7

To również wydaje się działać - grep dla liczby zakończeń linii w pliku

zgrep -Ec "$" file.gz
Patrick Wright
źródło
To daje inną (znacznie wyższą) odpowiedź dla mnie niż przesyłanie dowc -l
Stop Harming Monica
5

Jeśli chcesz to zrobić szybko, polecam użycie „pigz” (co IIRC oznacza „Parallel Implementation of GZip”). Właśnie miałem podobną sytuację, w której chciałem policzyć liczbę linii w pakiecie plików gzip i oto moje rozwiązanie:

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

Co dało mi liczbę wierszy i plik, z którego policzyłem na przemiennych liniach, używając 8 procesorów. Działało szybko!

Piotr
źródło
1
Lub jeśli unpigz nie jest dostępny, po prostu zfor x in *.fastq.gz; do zcat "$x" | wc -l && echo $x; done
Calimo,
2

Użyj tego polecenia:

gzgrep -c $ filename.gz

Polecenie gzgrepzachowuje się tak samo, jak grepw przypadku plików skompresowanych gzip. Rozpakowuje plik w locie w celu dopasowania wyrażenia regularnego.

W takim przypadku -cpoinstruuj polecenie, aby wypisało liczbę dopasowanych linii, a wyrażenie regularne $dopasowuje koniec linii, aby pasowało do każdej linii lub pliku.

Ostateczny wynik jest identyczny z gzip -dc filename.gz | grep -c $.

Ravi KM
źródło
Czy jest gzgrepdostępny na systemach innych niż Solaris?
pabouk
1
Nie. W innych systemach poleceniem byłoby zgrep -c $ nazwa_pliku.gz
Ravi KM
1
Chociaż intuicyjnie można by pomyśleć, że jest to lepsze niż zcat + wc, kiedy je mierzę, zajmują tyle samo czasu.
ngọcminh.oss
1

Jeśli zgadzasz się z przybliżoną wartością szacunkową, a nie dokładną liczbą, a tak naprawdę wyodrębnienie całego pliku lub zgrepowanie go dla końców linii zajęłoby o wiele za dużo (co było teraz moją sytuacją), możesz:

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

wtedy przybliżona liczba wierszy jest taka 1000 * (size of $file) / (size of 1000-line-sample), o ile dane są dość jednorodne w wierszu.

James
źródło
0

gzip -cd <file.gz> | wc -l

To zadziałało dla mnie.

prashanth
źródło