Split file gz et décompressez individuellement

J'ai un gros file .gz, qui est de 2,6 Go en soi. Je ne peux pas le décompresser en raison de la limitation de taille. Le file est un seul gros file text. Je ne suis pas en mesure de le décompresser complètement en raison de la limitation de taille. Je veux le split en 10 parties individuelles et décompresser chacune individuellement pour pouvoir utiliser chacun des files individuels:

Mes questions sont les suivantes:

  1. Est-ce possible ?
  2. En outre, dans le cadre de la réponse, si les commands peuvent également être fournies car je ne suis pas très bien versé dans ces commands

Merci

Le format de compression gzip supporte la décompression d'un file qui a été concaténé à partir de plusieurs files compressés plus petits (le file décompressé contiendra alors datatables décompressées concaténées), mais il ne supporte pas la décompression d'un file compressé découpé.

En supposant que vous voudriez vous refind avec une "tranche" des données décompressées, vous pouvez contourner cela en alimentant datatables décompressées en dd plusieurs fois, chaque fois en sélectionnant une tranche différente des données décompressées à save dans un file et en rejetant la du repos.

Ici, j'utilise un minuscule exemple de file text. Je le décompresse à plusieurs resockets (ce qui prendra un peu de time pour les files volumineux) et chaque fois que je sélectionne une tranche de 8 octets à partir des données décompressées. Vous feriez la même chose, mais utilisez une valeur beaucoup plus grande pour bs ("taille de bloc").

 $ 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.)

Utilisez un paramètre bs qui représente environ un dixième de la taille du file non compressé et, à chaque augmentation d'itération, skip de 0 à un.


UPDATE: L'user voulait countr le nombre de lignes dans datatables non compressées (voir les commentaires attachés à la question). Ceci est facilement accompli sans avoir à stocker une partie quelconque des données non compressées sur le disque:

 $ gunzip -c file.gz | wc -l 

gunzip -c va décompresser le file et écrire datatables non compressées sur la sortie standard. L'utilitaire wc avec l'indicateur -l va lire à partir de ce stream et countr le nombre de lignes lues.

Eh bien, split heureusement les choses pour vous de diverses manières.

Pour faire 10 parties individuelles, vous devez connaître la taille du file non compressé. Les éléments suivants devraient vous donner des files d'environ 1 GiB chacun.

 gunzip < bigfile.gz | split --line-bytes=1G - bigfile-split 

1G est encore beaucoup pour un file text, de nombreux éditeurs traitent mal de tels gros files. Donc, en fonction de ce que vous voulez vraiment en faire, vous voudrez peut-être opter pour de plus petites divisions. Ou laissez juste comme gz , fonctionne assez bien pour zgrep et d'autres outils, même si elle doit être décompressée à chaque fois.

S'il s'agit d'un file journal, vous voudrez peut-être affiner la rotation de votre journal, afin de produire des splits plus petits naturellement.