分割gz文件并单独解压缩

分割gz文件并单独解压缩

我有一个很大的 .gz 文件,其本身就有 2.6 GB。由于大小限制,我无法解压它。该文件是一个大文本文件。由于大小限制,我无法完全解压它。我想将其分成 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

(ETC。)

使用bs大约十分之一的设置未压缩的文件大小,并且在每次迭代中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,即使它每次都必须解压缩。

如果这是一个日志文件,您可能需要微调日志轮转,以自然地产生更小的分割。

相关内容