linux diff与comm命令比较文件(找出新增内容)
2013-08-02 11:39
811 查看
在项目中遇到一个奇怪的bug,是由一行简单代码引起的。
代码作用:比较两个UNIX文本文件,找出并打印文本2比文本1新增加的内容。
代码调用了diff命令,例如:
# diff命令输出结果
说明:输出结果去掉了两个文件的共同内容,只输出了temp2.txt的新增部分,和预想的结果一样。
但是,随着temp1.txt文件内容的增加,diff命令出现了不同预期的结果:
可以看到,diff命令不但输出了temp2.txt文件的新增部分(20110304-20110314),也同时输出了两个文件的共同内容(20110228-20110303),从而导致了与预期不一致的结果。
查看diff命令的man手册发现,diff的作用是比较两个文件的内容,并输出两个文件之间的差异,产生一个能够将两个文件互相转换的列表,但这个列表并不能100%保证是最小集。
于是,以上例子中,可以看到diff给出了temp1.txt和temp2.txt文件的比较差异结果,但其中包含了两个文件的共同部分,因此与预期不一样。
解决方法:
用comm命令代替diff,例如:
comm命令用来比较两个文件,具体用法:
comm [-123] file1 file2
-1 过滤file1独有的内容
-2 过滤file2独有的内容
-3 过滤file1和file2重复的内容
备注:
diff的输出格式,主要有以下几种:
n1 a n3,n4
n1,n2 d n3
n1,n2 c n3,n4
例如"1,2d0" "5a4,5" "1,55c1,11"等。
其中n1和n2指第一个文件的行数,n3和n4指第二个文件的行数。"a"代表add增加,"d"代表delete删除,"c"代表change整块变动。
有了diff的输出结果,可以使用patch命令将一个文件恢复成另一个,例如:
代码作用:比较两个UNIX文本文件,找出并打印文本2比文本1新增加的内容。
代码调用了diff命令,例如:
# temp1.txt文件内容 $> cat temp1.txt 20110224 20110225 20110228 20110301 20110302 # temp2.txt文件内容 $> cat temp2.txt 20110228 20110301 20110302 20110303 20110304
# diff命令输出结果
$> diff temp1.txt temp2.txt 1,2d0 < 20110224 < 20110225 5a4,5 > 20110303 > 20110304 # 只输出temp2.txt文件独有的内容 $> diff temp1.txt temp2.txt | grep "> " | sed 's/> //g' 20110303 20110304
说明:输出结果去掉了两个文件的共同内容,只输出了temp2.txt的新增部分,和预想的结果一样。
但是,随着temp1.txt文件内容的增加,diff命令出现了不同预期的结果:
$> cat temp1.txt 20101216 20101217 20101220 20101221 20101223 20101224 20101227 20101228 20101229 20101230 20101231 20110103 20110104 20110105 20110106 20110107 20110110 20110111 20110112 20110113 20110114 20110117 20110118 20110119 20110120 20110121 20110124 20110125 20110126 20110127 20110128 20110131 20110201 20110202 20110203 20110204 20110207 20110208 20110209 20110210 20110211 20110214 20110215 20110216 20110217 20110218 20110221 20110222 20110223 20110224 20110225 20110228 20110301 20110302 20110303 $> cat temp2.txt 20110228 20110301 20110302 20110303 20110304 20110307 20110308 20110309 20110310 20110311 20110314 $> diff temp1.txt temp2.txt 1,55c1,11 < 20101216 < 20101217 < 20101220 < 20101221 < 20101223 < 20101224 < 20101227 < 20101228 < 20101229 < 20101230 < 20101231 < 20110103 < 20110104 < 20110105 < 20110106 < 20110107 < 20110110 < 20110111 < 20110112 < 20110113 < 20110114 < 20110117 < 20110118 < 20110119 < 20110120 < 20110121 < 20110124 < 20110125 < 20110126 < 20110127 < 20110128 < 20110131 < 20110201 < 20110202 < 20110203 < 20110204 < 20110207 < 20110208 < 20110209 < 20110210 < 20110211 < 20110214 < 20110215 < 20110216 < 20110217 < 20110218 < 20110221 < 20110222 < 20110223 < 20110224 < 20110225 < 20110228 < 20110301 < 20110302 < 20110303 --- > 20110228 > 20110301 > 20110302 > 20110303 > 20110304 > 20110307 > 20110308 > 20110309 > 20110310 > 20110311 > 20110314 $> diff temp1.txt temp2.txt | grep "> " | sed 's/> //g' 20110228 20110301 20110302 20110303 20110304 20110307 20110308 20110309 20110310 20110311 20110314
可以看到,diff命令不但输出了temp2.txt文件的新增部分(20110304-20110314),也同时输出了两个文件的共同内容(20110228-20110303),从而导致了与预期不一致的结果。
查看diff命令的man手册发现,diff的作用是比较两个文件的内容,并输出两个文件之间的差异,产生一个能够将两个文件互相转换的列表,但这个列表并不能100%保证是最小集。
于是,以上例子中,可以看到diff给出了temp1.txt和temp2.txt文件的比较差异结果,但其中包含了两个文件的共同部分,因此与预期不一样。
解决方法:
用comm命令代替diff,例如:
$> comm -13 temp1.txt temp2.txt 20110304 20110307 20110308 20110309 20110310 20110311 20110314
comm命令用来比较两个文件,具体用法:
comm [-123] file1 file2
-1 过滤file1独有的内容
-2 过滤file2独有的内容
-3 过滤file1和file2重复的内容
备注:
diff的输出格式,主要有以下几种:
n1 a n3,n4
n1,n2 d n3
n1,n2 c n3,n4
例如"1,2d0" "5a4,5" "1,55c1,11"等。
其中n1和n2指第一个文件的行数,n3和n4指第二个文件的行数。"a"代表add增加,"d"代表delete删除,"c"代表change整块变动。
有了diff的输出结果,可以使用patch命令将一个文件恢复成另一个,例如:
$> cat temp1.txt 20110224 20110225 20110228 20110301 20110302 $> cat temp2.txt 20110228 20110301 20110302 20110303 20110304 $> diff temp1.txt temp2.txt > temp.diff $> cat temp.diff 1,2d0 < 20110224 < 20110225 5a4,5 > 20110303 > 20110304 # 使用temp.diff和temp1.txt恢复temp2文件 $> patch -i temp.diff -o temp2_restore.txt temp1.txt Looks like a normal diff. done # 完成后temp2_restore和原temp2文件内容一致 $> cat temp2_restore.txt 20110228 20110301 20110302 20110303 20110304
相关文章推荐
- linux下文件内容比较命令(diff,comm)
- 比较两个UNIX文本文件,找出新增内容(diff和comm命令)(转)
- Linux使用diff命令比较文件找出文件之间相同的部分
- linux下的comm和diff命令:用来比较两个文件的不同之处
- linux命令之diff命令详解(比较文件内容)
- linux下的comm和diff命令:用来比较两个文件的不同之处
- linux 比较文件相同部分comm命令和不同部分diff命令
- linux命令:怎么样比较2个文件的内容,然后将内容一致的行输出
- iconv内容,convmv文件名,unix2dos,dos2unix文件格式转换,od/cut/wc/dd/diff/uniq/nice/du等命令,linux文件名乱码,文件名,文件内容,vim编码设置
- linux命令大全之diff命令详解(比较文件内容)
- linux命令大全之diff命令详解(比较文件内容)
- diff命令_Linux diff 命令用法详解:比较给定的两个文件的不同
- iconv内容,convmv文件名,unix2dos,dos2unix文件格式转换,od/cut/wc/dd/diff/uniq/nice/du等命令,linux文件名乱码,文件名,文件内容,vim编码设置
- bzdiff命令_Linux bzdiff 命令用法详解:直接比较两个.bz2压缩包中文件的不同
- linux:使用comm命令比较两个文件:交集、差
- linux比较文件命令-diff
- Linux命令 --- 文件比较diff/cmp
- linux:使用comm命令比较两个文件:交集、差
- linux中比较文件差异命令diff【zz】
- comm命令_Linux comm 命令用法详解:两个文件之间的比较