количество строк в сжатом файле

43

если у меня есть файл .gz на Unix, который имеет определенное количество строк. Как я могу считать строки на Unix, не распаковывая его.

Виджай
источник
Без распаковки архива вы не можете считать строки.
zoli2k
См stackoverflow.com/questions/846062/wc-gzipped-files
sancho.s восстановило Моника

Ответы:

61

Очевидно, что вы не можете считать новые строки, если файл все еще сжат.

Но вы можете распаковать в поток и считать новые строки в этом потоке, даже не записывая (распакованный) файл на диск. Это будет примерно так:

zcat file.gz | wc -l

zcat для распаковки и cat, wc для подсчета слов. Смотрите man-страницы для обоих, если вы хотите узнать больше.

РЕДАКТИРОВАТЬ

Если у вас нет zcat, zcat - это просто другое имя для gunzip -c.


источник
7
На Unices, где gzipотличается от compress, вы хотите gzcat.
coneslayer
7

Это также, кажется, работает - grep для количества концовок в файле

zgrep -Ec "$" file.gz
Патрик Райт
источник
Это дает другой (гораздо выше) ответ для меня , чем конвейеру кwc -l
Стоп вредя Монике
5

Если вы хотите сделать это быстро, я рекомендую использовать «pigz» (что IIRC означает «Параллельная реализация GZip»). У меня просто была похожая ситуация, когда я хотел посчитать количество строк в куче gzip-файлов, и вот мое решение:

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

Который дал мне количество строк и файл, который он рассчитывал на чередующихся строках, используя 8 процессоров. Это бежало быстро!

Питер
источник
1
Или если unpigz не доступен, просто сfor x in *.fastq.gz; do zcat "$x" | wc -l && echo $x; done
Calimo
2

Используйте эту команду:

gzgrep -c $ filename.gz

Команда gzgrepведет себя так же, как и grepдля сжатых GZIP-файлов. Он распаковывает файл на лету для соответствия регулярному выражению.

В этом случае -cвведите команду для вывода количества совпавших строк, и регулярное выражение $соответствует концу строки, чтобы оно соответствовало каждой строке или файлу.

Окончательный результат идентичен gzip -dc filename.gz | grep -c $.

Рави К.М.
источник
Есть gzgrepдоступны на других системах , чем Solaris?
Пабук
1
Нет. В других системах команда будет выглядеть так: zgrep -c $ filename.gz
Ravi KM
1
Хотя можно интуитивно подумать, что это лучше, чем zcat + wc, но когда я их измеряю, они занимают столько же времени.
ngọcminh.oss
1

Если вы согласны с грубой оценкой, а не с точным подсчетом, и на самом деле извлечение всего файла или zgrepping его для концов строк может занять слишком много времени (что было моей ситуацией только сейчас), вы можете:

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

тогда приблизительное количество строк равно 1000 * (size of $file) / (size of 1000-line-sample), если ваши данные достаточно однородны для каждой строки.

Джеймс
источник
0

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

Это сработало для меня.

Prashanth
источник