contar linhas em um arquivo compactado

43

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

Vijay
fonte
Sem extrair o arquivo, você não pode contar as linhas.
Zoli2k
Consulte stackoverflow.com/questions/846062/wc-gzipped-files
sancho.s Restabeleça Monica

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.


fonte
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
Patrick Wright
fonte
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!

Pedro
fonte
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 $.

Ravi KM
fonte
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.

James
fonte
0

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

Isso funcionou para mim.

prashanth
fonte