jeśli mam plik .gz na Uniksie, który ma pewną liczbę linii. Jak mogłem policzyć linie na Uniksie bez rozpakowywania.
jeśli mam plik .gz na Uniksie, który ma pewną liczbę linii. Jak mogłem policzyć linie na Uniksie bez rozpakowywania.
Odpowiedzi:
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
.
gzip
różni się compress
, chcesz gzcat
.
To również wydaje się działać - grep dla liczby zakończeń linii w pliku
zgrep -Ec "$" file.gz
wc -l
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!
for x in *.fastq.gz; do zcat "$x" | wc -l && echo $x; done
Użyj tego polecenia:
gzgrep -c $ filename.gz
Polecenie gzgrep
zachowuje się tak samo, jak grep
w przypadku plików skompresowanych gzip. Rozpakowuje plik w locie w celu dopasowania wyrażenia regularnego.
W takim przypadku -c
poinstruuj 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 $
.
gzgrep
dostępny na systemach innych niż Solaris?
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.