jeśli mam plik .gz na Uniksie, który ma pewną liczbę linii. Jak mogłem policzyć linie na Uniksie bez rozpakowywania.
command-line
unix
Vijay
źródło
źródło
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 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
gzip
różni sięcompress
, chceszgzcat
.To również wydaje się działać - grep dla liczby zakończeń linii w pliku
źródło
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:
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!
źródło
for x in *.fastq.gz; do zcat "$x" | wc -l && echo $x; done
Użyj tego polecenia:
Polecenie
gzgrep
zachowuje się tak samo, jakgrep
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 $
.źródło
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:
wtedy przybliżona liczba wierszy jest taka
1000 * (size of $file) / (size of 1000-line-sample)
, o ile dane są dość jednorodne w wierszu.źródło
gzip -cd <file.gz> | wc -l
To zadziałało dla mnie.
źródło