якщо у мене є файл .gz в unix, який має певну кількість рядків. Як я міг порахувати рядки на unix, не знімаючи його.
якщо у мене є файл .gz в unix, який має певну кількість рядків. Як я міг порахувати рядки на unix, не знімаючи його.
Відповіді:
Ви, очевидно, не можете рахувати нові рядки, якщо файл все-таки стиснений.
Але ви можете декомпресувати до потоку і рахувати нові рядки в цьому потоці, не записуючи жодного разу (декомпресованого) файлу на диск. Це піде приблизно так:
zcat file.gz | wc -l
zcat для декомпресії & cat, wc для wordcount. Перегляньте чоловічі сторінки для обох, якщо хочете дізнатися більше.
EDIT
Якщо у вас немає zcat, zcat - це лише інша назва gunzip -c
.
gzip
це відрізняється compress
, ви хочете gzcat
.
Це також здається спрацьовує - grep для кількості закінчень рядків у файлі
zgrep -Ec "$" file.gz
wc -l
Якщо ви хочете зробити це швидко, я рекомендую використовувати "pigz" (що IIRC означає "Паралельна реалізація GZip"). У мене просто була подібна ситуація, коли я хотів порахувати кількість рядків у купі файлів gzip'ed, і ось було моє рішення:
for x in *.gz; do unpigz -p 8 -c $x | wc -l && echo $x; done
Що дало мені кількість рядків та файл, з якого він рахував, на чергуванні рядків, використовуючи 8 процесорів. Він швидко пробіг!
for x in *.fastq.gz; do zcat "$x" | wc -l && echo $x; done
Використовуйте цю команду:
gzgrep -c $ filename.gz
Команда gzgrep
поводиться так само, як grep
і у файлах, що стискають gzip. Він розпаковує файл на ходу для відповідності регулярного виразів.
У цьому випадку -c
доручіть команді вивести кількість відповідних рядків, а регулярний вирівнювання $
збігається з кінцем рядка, щоб він відповідав кожному рядку або файлу.
Кінцевий результат ідентичний gzip -dc filename.gz | grep -c $
.
gzgrep
в інших системах, ніж Solaris?
Якщо ви добре з приблизною оцінкою, а не точним підрахунком, а фактичне вилучення всього файлу або зрізання його для закінчень рядків займе дуже багато часу (що було моєю ситуацією лише зараз), ви можете:
zcat "$file" | head -1000 > 1000-line-sample.txt
ls -ls 1000-line-sample.txt "$file"
то приблизна кількість рядків дорівнює 1000 * (size of $file) / (size of 1000-line-sample)
, якщо ваші дані досить однорідні на рядок.