如何在不解压缩的情况下从 gzip 文件中删除第一行?

How to delete the first line from a gzip file without decompressing?

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

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

所以我认为答案是:不会。

深入实际实现zip算法(准确的说是Lempel Ziv压缩算法)的细节,你会发现有一定大小的数据windows。
可以解压的传入数据有一个最大长度,由大小"ahead" window决定。在已经解压缩的数据中,数据可以用作查找的最大距离也存在,"back" window.
因此可能只解压缩压缩数据的一部分,大到足以确保压缩数据的其余部分不引用它之前的任何内容。 IE。如此之大,以至于从压缩数据的某个点开始,不再有对您要删除的内容的引用。然后你可以重新压缩没有你想要删除的第一行的那部分。

不过我相信这种方法超出了您的疑问。否则你会提供更多的信息。

所以我想我会坚持:不。

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

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

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

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

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

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