我有一个大型测试文件,其.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
,那么创建更多相同的部分也会降低熵,从而提高压缩率,即使.
不是一个特殊字符。