如何在Unix中比较两种zip格式(.tar,.gz,.Z)文件

时间:2010-07-05 10:47:23

标签: linux unix gzip

我有两个gz文件。我想比较这些文件而不提取。例如:

第一个文件是number.txt.gz - 在该文件中:

1111,589,3698, 
2222,598,4589, 
3333,478,2695, 
4444,258,3694, 

第二个文件 - xxx.txt.gz:

1111,589,3698, 
2222,598,4589, 

我想比较这些文件之间的任何列。如果第一个文件中的column1等于第二个文件的第1列,则意味着我想要输出如下:

1111,589,3698, 
2222,598,4589,

5 个答案:

答案 0 :(得分:2)

你不能这样做。

您可以通过比较存档来比较存档中的所有内容,但不能比较压缩文件中数据的一部分。

您可以比较归档中的所选文件而无需解压缩,因为归档包含 CRC32 控制和的元数据,您必须比较此总和才能知道这一点而无需解压缩。

答案 1 :(得分:2)

如果您需要在将数据写入这些大文件后对其进行检查和比较,并且由于时间和空间限制而无法执行此操作,那么您使用的是错误的存储格式。如果您的数据存储格式不支持您的流程,则需要更改。

我的建议是将数据放入数据库而不是将其写入压缩文件。使用合理的密钥,可以通过简单的查询来完成数据子集的比较,删除不再需要的数据变得同样简单。

事务性和严格的SQL合规性可能不是优先事项,因此我将使用MySQL(使用MyISAM驱动程序)作为一个简单,快速的数据库。


编辑:或者,Blorgbeard的建议是完全合理和可行的。在任何可以访问(反)压缩库的编程语言中,您可以按顺序读取压缩文件,而无需将扩展文本写入磁盘;如果您并排执行两个输入文件,则可以实现比较而不会出现任何空间问题。

至于时间问题,您会发现读取和解压缩文件(但不将其写入磁盘)比写入磁盘要快得多。我最近编写了一个类似的程序,它将.ZIPped文件作为输入,并创建一个.ZIPped文件作为输出,而无需将未压缩的数据写入文件;并且它比解压缩,处理和重新打包数据的早期版本运行得快得多。

答案 2 :(得分:1)

在使用不同技术保留压缩文件时,无法对这些文件进行比较。

您必须首先解压缩文件,然后找出结果之间的差异。

可以使用gunzip,tar和uncompress(或zcat)来完成解压缩。

可以使用diff命令查找差异。

答案 3 :(得分:1)

我不是100%确定它是匹配列/字段还是整行,但在行的情况下,这些行中的某些内容应该有效:

comm -12 <(zcat number.txt.gz) <(zcat xxx.txt.gz)

或者如果shell不支持,可能是:

zcat number.txt.gz | { zcat xxx.txt.gz | comm -12 /dev/fd/3 - ; } 3<&0

答案 4 :(得分:0)

我想要的确切答案只是

nawk -F"," 'NR==FNR {a[$1];next} ($3 in a)' <(gzcat file1.txt.gz) <(gzcat file2.txt.gz)

。而不是awk,nawk完美地工作,它是gzip文件所以使用gzcat