【问题标题】:How to delete the first line from a gzip file without decompressing?如何在不解压缩的情况下从 gzip 文件中删除第一行?
【发布时间】:2020-02-28 09:08:52
【问题描述】:

我有一个很大的gzip 文件,解压缩速度很慢。如何在不解压整个文件的情况下就地删除第一行?

【问题讨论】:

  • 你有什么尝试吗?
  • Zip 算法使用已经解压的内容作为以下内容的查找表。我相信这直接意味着如果你删除第一行,它肯定需要重新压缩文件的其余部分,这反过来意味着需要先解压缩它。所以我相信答案是:不是。
  • 你不能。唯一的选择是解压缩,删除第一行然后重新压缩。应该可以使用管道,这意味着未压缩的数据不会存储到磁盘。

标签: bash gzip


【解决方案1】:

Zip 算法使用已经解压缩的内容作为以下内容的查找表。我相信这直接意味着如果你删除第一行,它肯定需要重新压缩文件的其余部分,这反过来意味着需要先解压缩它。

所以我相信答案是:不是。

深入了解实际实现 zip 算法(准确地说是 Lempel Ziv 压缩算法)的细节,您会发现存在一定大小的数据窗口。
可以解压缩的传入数据的最大长度取决于“提前”窗口的大小。在已经解压的数据中,数据可以用作查找的最大距离,即“后退”窗口。
因此,可能只解压缩一部分压缩数据,足够大以确保其余压缩数据不引用之前的任何内容。 IE。如此之大,以至于从压缩数据中的某个点开始,您将要删除的内容不再出现任何引用。然后,您可以重新压缩该部分而无需删除要删除的第一行。

但是,我相信这种方法超出了您的问题范围。否则你会提供更多的信息。

所以我想我会留下来:不会。

或者至少:
您将必须真正了解 Zip 算法,以至于您可以自己实现它。然后进一步了解您正在处理的文件中算法的精确实现。然后了解您正在查看的压缩的精确配置(两个窗口的大小)。
那就多花点功夫吧。

详细了解如何做到这一点超出了这里的答案。

【讨论】:

【解决方案2】:

除了非常特殊的情况,您需要解压缩、应用更改并重新压缩内容。但是,这可以以流方式完成,因此您无需将解压缩版本存储在某个地方。

在 Unix shell 环境中,这通常使用管道完成,并且可以使用以下脚本完成:

zcat input.gz | tail -n +2 | gzip > output.gz

这需要一段时间,但不会因为文件的解压版本太大而超出您的存储空间。

【讨论】:

    猜你喜欢
    • 2018-04-12
    • 2011-07-20
    • 2011-12-30
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 2013-10-03
    相关资源
    最近更新 更多