Divida el archivo gz y descomprímalo individualmente

Divida el archivo gz y descomprímalo individualmente

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:

  1. Es eso posible ?
  2. 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 gzipformato 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 ddvarias 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 bsajuste que sea aproximadamente una décima parte delsin comprimirtamaño del archivo, y en cada iteración aumentar skipde 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 -cdescomprimirá el archivo y escribirá los datos sin comprimir en la salida estándar. La wcutilidad con la -lbandera leerá esta secuencia y contará el número de líneas leídas.

Respuesta2

Bueno, splitcon 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 gzfunciona bastante bien para zgrepotras 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.

información relacionada