підрахунок рядків у стисненому файлі


43

якщо у мене є файл .gz в unix, який має певну кількість рядків. Як я міг порахувати рядки на unix, не знімаючи його.


Без вилучення архіву ви не можете рахувати рядки.
zoli2k

Відповіді:


61

Ви, очевидно, не можете рахувати нові рядки, якщо файл все-таки стиснений.

Але ви можете декомпресувати до потоку і рахувати нові рядки в цьому потоці, не записуючи жодного разу (декомпресованого) файлу на диск. Це піде приблизно так:

zcat file.gz | wc -l

zcat для декомпресії & cat, wc для wordcount. Перегляньте чоловічі сторінки для обох, якщо хочете дізнатися більше.

EDIT

Якщо у вас немає zcat, zcat - це лише інша назва gunzip -c.


7
У Unices, де gzipце відрізняється compress, ви хочете gzcat.
конічний шар


5

Якщо ви хочете зробити це швидко, я рекомендую використовувати "pigz" (що IIRC означає "Паралельна реалізація GZip"). У мене просто була подібна ситуація, коли я хотів порахувати кількість рядків у купі файлів gzip'ed, і ось було моє рішення:

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
Раві KM

1
Хоча інтуїтивно можна подумати, що це краще, ніж zcat + wc, коли я їх час, вони забирають стільки ж часу.
ngọcminh.oss

1

Якщо ви добре з приблизною оцінкою, а не точним підрахунком, а фактичне вилучення всього файлу або зрізання його для закінчень рядків займе дуже багато часу (що було моєю ситуацією лише зараз), ви можете:

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

то приблизна кількість рядків дорівнює 1000 * (size of $file) / (size of 1000-line-sample), якщо ваші дані досить однорідні на рядок.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.