gzファイルを分割して個別に解凍

gzファイルを分割して個別に解凍

2.6GBの大きな.gzファイルがあります。容量制限のため、解凍できません。ファイルは大容量のテキストファイルです。サイズ制限のため、圧縮を完全に解放できません。各ファイルを操作できるように10個の別々の部分に分割し、各部分の圧縮を個別に解きたいと思います。

私の質問は次のとおりです

  1. それは可能ですか?
  2. 또한 대답의 일부로 명령에 익숙하지 않기 때문에 명령을 제공하는 것도 가능합니까?

ありがとう

答え1

このgzip圧縮形式は、複数のリンクされた小さな圧縮ファイルで構成されるファイルの解凍をサポートしますが(解凍されたファイルには連結された解凍されたデータが含まれます)、分割された圧縮ファイルの解凍はサポートされません。

解凍されたデータの「フラグメント」で終わりたいと仮定すると、解凍されたデータを複数回供給し、解凍されたddデータの別の部分を毎回選択してファイルに保存し、残りを削除することでこの問題を解決できます。

ここでは非常に小さなサンプルテキストファイルを使用しています。何度も解凍しました(〜する(大きなファイルの場合は少し時間がかかります。)そして解凍されたデータから8バイトの断片を選択するたびに。同じことができますが、より大きな値bs(「ブロックサイズ」)を使用できます。

$ 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

(等)

bs設定の約10分の1のみ使用圧縮されていないファイルサイズは繰り返すたびにskip0から1に増えます。


更新:ユーザーは圧縮されていないデータの行数を計算しようとします(質問に添付されているコメントを参照)。これにより、圧縮されていないデータの一部をディスクに保存することなく簡単に実行できます。

$ gunzip -c file.gz | wc -l

gunzip -cファイルを解凍し、非圧縮データを標準出力に書き込みます。wcこのフラグを持つユーティリティは、-lこのストリームからデータを読み取り、読み取った行数を計算します。

答え2

まあ、splitどんな方法でも皆さんと共有することができて嬉しいです。

10個の個別部品を作成するには、圧縮されていないファイルのサイズを知る必要があります。以下は、それぞれサイズが約1GiBのファイルを提供します。

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

1Gは依然としてテキストファイルによく使用されており、多くのエディタはこれらの大容量ファイルをうまく処理できません。したがって、実際に実行したい操作に応じて、より小さな分割を実行することもできます。または、毎回解凍する必要がある場合でも、gz他のツールに十分なままにしてください。zgrep

ログファイルの場合は、自然に小さな分割が生成されるようにログの回転を微調整する必要があります。

関連情報