contar linhas em um arquivo compactado


Respostas:


61

Obviamente, você não pode contar novas linhas se o arquivo ainda estiver compactado.

Mas você pode descompactar em um fluxo e contar as novas linhas nesse fluxo, sem precisar gravar o arquivo (descompactado) no disco. Isso seria algo assim:

zcat file.gz | wc -l

zcat para descomprimir & cat, wc para wordcount. Consulte as páginas de manual para ambos, se você quiser saber mais.

EDITAR

Se você não possui zcat, zcat é apenas outro nome para gunzip -c.


7
Nos Unices, onde gzipé diferente compress, você deseja gzcat.
coneslayer

7

Isso também parece funcionar - grep pelo número de terminações de linha no arquivo

zgrep -Ec "$" file.gz

Isto dá uma diferente (muito maior) resposta para mim do que a tubagem awc -l
parar de prejudicar Monica

5

Se você quiser fazer isso rapidamente, recomendo usar 'pigz' (que IIRC significa "Implementação Paralela do GZip"). Eu apenas tive uma situação semelhante em que queria contar o número de linhas em um monte de arquivos compactados com gzip e aqui estava a minha solução:

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

O que me deu o número de linhas e o arquivo em linhas alternadas, usando 8 processadores. Correu rapidamente!


11
Ou se unpigz não está disponível, simplesmente comfor x in *.fastq.gz; do zcat "$x" | wc -l && echo $x; done
Calimo

2

Use este comando:

gzgrep -c $ filename.gz

O comando gzgrepse comporta da mesma maneira que grepnos arquivos compactados gzip. Ele descompacta o arquivo rapidamente para a correspondência de regex.

Nesse caso, -cinstrua o comando a emitir o número de linhas correspondentes e o regex $corresponde ao final da linha para que corresponda a todas as linhas ou arquivos.

O resultado final é idêntico a gzip -dc filename.gz | grep -c $.


Está gzgrepdisponível em outros sistemas que não o Solaris?
pabouk

11
Não. Em outros sistemas, o comando seria zgrep -c $ filename.gz
Ravi KM

11
Embora se possa pensar intuitivamente que isso é melhor que zcat + wc, quando eu cronometro eles, eles levam a mesma quantidade de tempo.
Ngọcminh.oss

1

Se você estiver de acordo com uma estimativa aproximada, e não com uma contagem exata, e realmente extrair o arquivo inteiro ou zgrepping-lo para terminações de linha, levaria muito tempo (que era minha situação agora), você pode:

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

a contagem aproximada de linhas é 1000 * (size of $file) / (size of 1000-line-sample), desde que seus dados sejam bastante homogêneos por linha.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.