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.
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.
Respostas:
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
.
gzip
é diferente compress
, você deseja gzcat
.
Isso também parece funcionar - grep pelo número de terminações de linha no arquivo
zgrep -Ec "$" file.gz
wc -l
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!
for x in *.fastq.gz; do zcat "$x" | wc -l && echo $x; done
Use este comando:
gzgrep -c $ filename.gz
O comando gzgrep
se comporta da mesma maneira que grep
nos arquivos compactados gzip. Ele descompacta o arquivo rapidamente para a correspondência de regex.
Nesse caso, -c
instrua 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 $
.
gzgrep
disponível em outros sistemas que não o Solaris?
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.