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

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

2.6 GB もある大きな .gz ファイルがあります。サイズ制限のため、解凍できません。ファイルは 1 つの大きなテキスト ファイルです。サイズ制限のため、完全に解凍できません。たとえば 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 個の個別のパーツを作成するには、圧縮されていないファイルのサイズを知る必要があります。次のファイルでは、各パーツのサイズが約 1 GiB になります。

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

1G はテキスト ファイルとしてはまだ大きいですが、多くのエディターはこのような大きなファイルの処理が不十分です。そのため、実際に何をしたいかに応じて、分割サイズを小さくすることをお勧めします。または、 のままにしておくと、毎回解凍する必要があっても、 やその他のツールgzでは十分に機能します。zgrep

これがログ ファイルである場合は、ログのローテーションを微調整して、自然に小さな分割を生成することをお勧めします。

関連情報