conta linhas em um arquivo compactado

35

se eu tiver um arquivo .gz no unix que tenha certo número de linhas. Como eu poderia contar as linhas no unix sem descompactá-lo.

    
por Vijay 27.04.2010 / 09:37

5 respostas

55

Você obviamente não pode contar novas linhas se o arquivo ainda estiver compactado.

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

zcat file.gz | wc -l

zcat para descomprimir & gato, wc para wordcount. Veja man pages para ambos se você quiser saber mais.

EDITAR

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

    
por 27.04.2010 / 09:40
6

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

zgrep -Ec "$" file.gz
    
por 27.02.2012 / 16:31
5

Se você quiser fazê-lo rapidamente, eu recomendo usar o 'pigz' (que o IIRC significa "Parallel Implementation of GZip"). Acabei de ter uma situação semelhante em que queria contar o número de linhas em vários arquivos gzip'ed e aqui estava 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 contado a partir de linhas alternadas, usando 8 processadores. Correu rapidamente!

    
por 12.04.2012 / 01:20
2

Use este comando:

gzgrep -c $ filename.gz

O comando gzgrep se comporta da mesma forma que grep , mas em arquivos compactados gzip. Ele descompacta o arquivo na hora para a correspondência regex.

Nesse caso, -c instrui o comando a gerar o número de linhas correspondentes e o regex $ corresponde ao fim da linha para corresponder a cada linha ou arquivo.

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

    
por 21.11.2014 / 10:12
0

Se você estiver bem com uma estimativa aproximada, em vez de uma contagem exata, e realmente extrair o arquivo inteiro ou zgrepping-lo para fins de linha demoraria muito tempo (que era a 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.

    
por 28.09.2015 / 17:06