为什么尽管我的文本文件的物理大小增加了,但其 .gz 压缩文件的大小却明显减小了

为什么尽管我的文本文件的物理大小增加了,但其 .gz 压缩文件的大小却明显减小了

我有一个大型测试文件,其.gz格式约为 13 GB。我替换了原始文件中的子字符串,并将文件压缩为.gz格式。

为此,我使用了以下 Linux 命令:

zcat $inFile | sed -e "s/0\/0:.:.:./0\/0:.:1,0,0:./g"  | gzip > $outFile

0/0:.:.:.—> 0/0:.:1,0,0:

如您所见,我将一个字符替换为 5 个字符,但输出文件的物理大小仍约为 12 GB。

有人能帮助我了解这里发生了什么吗?

答案1

sed命令的语法包括使用通配符特殊字符。在这些特殊字符中,.代表任何特点。

因此命令:

sed -e "s/0\/0:.:.:./0\/0:.:1,0,0:./g"

将取代3随机的:适合实际字符.或其他字符序列的字符固定的值,从而降低熵。

例如它将替换以下 6 行:

0/0:a:b:c
0/0:d:e:f
0/0:g:h:i
0/0:j:k:l
0/0:m:n:o
0/0:p:q:r

和:

0/0:.:1,0,0:.
0/0:.:1,0,0:.
0/0:.:1,0,0:.
0/0:.:1,0,0:.
0/0:.:1,0,0:.
0/0:.:1,0,0:.

这是重复同一句话的 6 次:更容易压缩为更小的尺寸。

虽然上述内容很可能是压缩率提高的主要原因,此外,正如 Patrick Abraham(和 Kamil Maciorowski)所建议的,另一种机制也是可能的:如果0/0:.:1,0,0:.在使用之前已经包含了部分sed,那么创建更多相同的部分也会降低熵,从而提高压缩率,即使.不是一个特殊字符。

相关内容