contar líneas en un archivo comprimido


Respuestas:


61

Obviamente, no puede contar nuevas líneas si el archivo todavía está comprimido.

Pero puede descomprimir en una secuencia y contar las nuevas líneas en esa secuencia, sin siquiera escribir el archivo (descomprimido) en el disco. Eso sería algo así:

zcat file.gz | wc -l

zcat para descomprimir y cat, wc para conteo de palabras. Vea las páginas de manual para ambos si desea saber más.

EDITAR

Si no tiene zcat, zcat es solo otro nombre para gunzip -c.


77
En Unices donde gzipes distinto de lo compressque quieres gzcat.
coneslayer


5

Si desea hacerlo rápidamente, le recomiendo usar 'pigz' (que IIRC significa "Implementación paralela de GZip"). Acabo de tener una situación similar en la que quería contar el número de líneas en un montón de archivos gzip'ed y aquí estaba mi solución:

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

Lo que me dio el número de líneas y el archivo desde el que contó en líneas alternas, usando 8 procesadores. ¡Corrió rápido!


1
O si unpigz no está disponible, simplemente confor x in *.fastq.gz; do zcat "$x" | wc -l && echo $x; done
Calimo

2

Usa este comando:

gzgrep -c $ filename.gz

El comando se gzgrepcomporta igual que greppero en los archivos comprimidos de gzip. Descomprime el archivo sobre la marcha para la coincidencia de expresiones regulares.

En este caso, -cindique al comando que muestre el número de líneas coincidentes y la expresión regular $coincide con el final de la línea para que coincida con cada línea o el archivo.

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


¿Está gzgrepdisponible en otros sistemas que no sean Solaris?
pabouk

1
No. En otros sistemas, el comando sería zgrep -c $ filename.gz
Ravi KM

1
Aunque uno podría pensar intuitivamente que esto es mejor que zcat + wc, cuando los cronometro, toman la misma cantidad de tiempo.
ngọcminh.oss

1

Si está de acuerdo con una estimación aproximada en lugar de un recuento exacto, y en realidad extraer todo el archivo o agruparlo para las terminaciones de línea tomaría demasiado tiempo (que era mi situación en este momento), puede:

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

entonces el recuento aproximado de líneas es 1000 * (size of $file) / (size of 1000-line-sample), siempre que sus datos sean bastante homogéneos por línea.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.