2.6 GB もある大きな .gz ファイルがあります。サイズ制限のため、解凍できません。ファイルは 1 つの大きなテキスト ファイルです。サイズ制限のため、完全に解凍できません。たとえば 10 個の個別の部分に分割し、それぞれを個別に解凍して、各ファイルを使用できるようにしたいと考えています。
私の質問は次のとおりです:
- それは可能ですか?
- また、回答の一部として、コマンドも提供していただければと思います。私はこれらのコマンドにあまり精通していないからです。
ありがとう
答え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の設定を使用してください圧縮されていないファイル サイズは、各反復でskip
0 から 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
これがログ ファイルである場合は、ログのローテーションを微調整して、自然に小さな分割を生成することをお勧めします。