我有一个很大的 .gz 文件,其本身就有 2.6 GB。由于大小限制,我无法解压它。该文件是一个大文本文件。由于大小限制,我无法完全解压它。我想将其分成 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
(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
,即使它每次都必须解压缩。
如果这是一个日志文件,您可能需要微调日志轮转,以自然地产生更小的分割。