Tengo un archivo .gz grande, que en sí mismo tiene 2,6 GB. No puedo descomprimirlo debido a limitaciones de tamaño. El archivo es un único archivo de texto grande. No puedo descomprimirlo por completo debido a una limitación de tamaño. Quiero dividirlo en, digamos, 10 partes individuales y descomprimir cada una individualmente para poder usar cada archivo individual:
Mis preguntas son:
- Es eso posible ?
- Además, como parte de la respuesta, si los comandos también se pueden proporcionar, ya que no estoy muy versado en estos comandos.
Gracias
Respuesta1
El gzip
formato de compresión admite la descompresión de un archivo que ha sido concatenado a partir de varios archivos comprimidos más pequeños (el archivo descomprimido contendrá los datos descomprimidos concatenados), pero no admite la descompresión de un archivo comprimido cortado.
Suponiendo que desea terminar con una "porción" de los datos descomprimidos, puede solucionar este problema ingresando los datos descomprimidos dd
varias veces, seleccionando cada vez una porción diferente de los datos descomprimidos para guardar en un archivo y descartando el resto. .
Aquí estoy usando un pequeño archivo de texto de ejemplo. Lo estoy descomprimiendo repetidamente (lo cualvoluntadtoma un poco de tiempo para archivos grandes), y cada vez elijo una porción de 8 bytes de los datos descomprimidos. Haría lo mismo, pero usaría un valor mucho mayor para bs
("tamaño de bloque").
$ cat file
hello
world
1
2
3
ABC
$ gzip -f file # using -f to force compression here, since the example is so small
$ gunzip -c file.gz | dd skip=0 bs=8 count=1 of=fragment
1+0 records in
1+0 records out
8 bytes transferred in 0.007 secs (1063 bytes/sec)
$ cat fragment
hello
wo
$ gunzip -c file.gz | dd skip=1 bs=8 count=1 of=fragment
1+0 records in
1+0 records out
8 bytes transferred in 0.000 secs (19560 bytes/sec)
$ cat fragment
rld
1
2
(etc.)
Utilice un bs
ajuste que sea aproximadamente una décima parte delsin comprimirtamaño del archivo, y en cada iteración aumentar skip
de 0 a uno.
ACTUALIZACIÓN: El usuario quería contar el número de líneas en los datos sin comprimir (ver comentarios adjuntos a la pregunta). Esto se logra fácilmente sin tener que almacenar ninguna parte de los datos sin comprimir en el disco:
$ gunzip -c file.gz | wc -l
gunzip -c
descomprimirá el archivo y escribirá los datos sin comprimir en la salida estándar. La wc
utilidad con la -l
bandera leerá esta secuencia y contará el número de líneas leídas.
Respuesta2
Bueno, split
con gusto te dividiremos las cosas de varias maneras.
Para crear 10 piezas individuales, tendrías que saber el tamaño del archivo sin comprimir. Lo siguiente debería proporcionarle archivos de aproximadamente 1 GiB de tamaño cada uno.
gunzip < bigfile.gz | split --line-bytes=1G - bigfile-split
1G sigue siendo mucho para un archivo de texto; muchos editores manejan mal archivos tan grandes. Entonces, dependiendo de lo que realmente quieras hacer con él, es posible que desees realizar divisiones más pequeñas. O simplemente déjelo como gz
funciona bastante bien para zgrep
otras herramientas, incluso si tiene que descomprimirlo cada vez.
Si se trata de un archivo de registro, es posible que desee ajustar la rotación del registro para producir divisiones más pequeñas de forma natural.