si tengo un archivo .gz en Unix que tiene cierto número de líneas. ¿Cómo podría contar las líneas en Unix sin descomprimirlo?
si tengo un archivo .gz en Unix que tiene cierto número de líneas. ¿Cómo podría contar las líneas en Unix sin descomprimirlo?
Respuestas:
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
.
gzip
es distinto de lo compress
que quieres gzcat
.
Esto también parece funcionar: grep para el número de finales de línea en el archivo
zgrep -Ec "$" file.gz
wc -l
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!
for x in *.fastq.gz; do zcat "$x" | wc -l && echo $x; done
Usa este comando:
gzgrep -c $ filename.gz
El comando se gzgrep
comporta igual que grep
pero en los archivos comprimidos de gzip. Descomprime el archivo sobre la marcha para la coincidencia de expresiones regulares.
En este caso, -c
indique 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 $
.
gzgrep
disponible en otros sistemas que no sean Solaris?
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.