找出两个文件内容的相同与不同
http://blog.sina.com.cn/s/blog_b37976350102x7jw.html
1. comm命令
功能说明:比较两个已排过序的文件。(使用sort排序)
语 法:comm [-123][--help][--version][第1个文件][第2个文件]
补充说明:这项指令会一列列地比较两个已排序文件的差异,并将其结果显示出来,如果没有指定任何参数,则会把结果分成3栏显示:第1栏仅是在第1个文件中出现过的记录,第2栏是仅在第2个文件中出现过的记录,第3栏则是在第1与第2个文件里都出现过的记录。若给予的文件名改为"-",则comm指令会从标准输入设备读取数据。
参 数:
-1 不显示只在第1个文件里出现过的列。
-2 不显示只在第2个文件里出现过的列。
-3 不显示只在第1和第2个文件里出现过的列。
--help 在线帮助。
--version 显示版本信息。
例子
comm - 12 就只显示在两个文件中都存在的行;
comm - 23 只显示在第一个文件中出现而未在第二个文件中出现的行;
comm - 123 则什么也不显示。
2. diff 命令
功能说明:比较文件的差异。
语 法:diff [-abBcdefHilnNpPqrstTuvwy][-<行数>][-C <行数>][-D <巨集名称>][-I <字符或字符串>][-S <文件>][-W <宽度>][-x <文件或目录>][-X <文件>][--help][--left-column][--suppress-common-line][文件或目录1][文件或目录2]
补充说明:diff以逐行的方式,比较文本文件的异同处。所是指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录。
例如: 找出a.txt文件有而b.txt文件中没有的放在c.txt文件中
- #!/bin/sh
- # author by tianmo
- # date 2011-11-21 20:33
- #BEGIN
- cat a.txt | sort | uniq | sort > a_u.txt
- cat b.txt | sort | uniq | sort > b_u.txt
- diff a_u.txt b_u.txt | grep /< | awk ' $1 = " " ' > c.txt
- # END
3 比较两个文件并删除相同部分
comm -23 file1 file2
方法二:
grep -v -f file1 file2
方法三:
awk '{print NR,$0}' file1 file2 |sort -k2|uniq -u -f 1|sort -k1|awk '{print $2}'
或者:
awk '{print $0}' file1 file2 |sort|uniq -u
4. shell删除两个文件相同部分
方法一:使用grep
参数-v,表示invert match,即反向匹配,输出没有匹配上的项。参数-f,表示从文件中读取匹配模板(pattern)。方法一中的前一部分,在文件file1中匹配模板,来反向匹配文件file2中的内容,即输出文件file2中,在file1中没有的内容。后面的一部分同理可得,输出文件file1中,在file2中没有的内容。
方法二:实用comm
如果使用--nocheck-order参数,不进行有序性检测,结果如下:
line0
line2
line2
从这个结果中我们可以看到,这还是不是我们真正想要的结果。这里可体现comm的另一个特征,就是逐行比较。它是对file1和file2进行逐行往下的比较,检测是否相同。所以,在用comm的时候,要根据具体的情况进行分析了。
方法三:使用awk
补充的重要内容:
1、统计两个文本文件的相同行
grep -Ff file1 file2
2、统计file1中有,file2中没有的行
grep -vFf file1 file2
grep -Fvxf <(grep -Fxf file1 file2 ) file1 file2
如何比较两个文件并去删除相同的内容
for i in $(>tmp1 ; done
输出相同行:
$grep -wf file1 file2
输出不同行
$grep -wvf file1 file2
浙公网安备 33010602011771号