linux 比较文件输出不同的内容
目前据我所了解的有如下几种方法,来比较两个文件的行,以输出他们的不同之处:
1) comm mission:
comm [-123] file1 file2 [> sfile]
NOTE: file1,file2 must be firstly sorted !
-1/2/3 means: -1 ----- rid the only retained contents in file1
-2 ----- rid the only retained contents in file2
-3 ----- rid the communal lines in both two files
正如,上面说的那样,comm命令运用的前提是针对两个sorted文件!
该命令是对两个已经排好序的文件进行比较。其中file1和file2是已排序的文件。comm读取这两个文件,然后生成三列输出:仅在file1中出现的行;仅在file2中出现的行;在两个文件中都存在的行。如果文件名用“- ”,则表示从标准输入读取。
选项1、2或3抑制相应的列显示。例如comm - 12就只显示在两个文件中都存在的行;comm - 23只显示在第一个文件中出现而未在第二个文件中出现的行;comm - 123则什么也不显示。
2) grep mission:
grep -v -f file1 file2
/*注::此法在对比数字时候比较凑效果,文本对比不建议使用*/
3) awk mission:
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) diff mission:
diff [-opt] file1 file2
(1.)grep -F YOURSTRING -R path
功能:用grep搜索文档中的字符串
[root@SOR_SYS hahah]# grep -F 0576 -R /root/zy/hahah
/root/zy/hahah/b:05766798607
/root/zy/hahah/b:05766798608
/root/zy/hahah/b:05766798609
/root/zy/hahah/a:05766798608
(2.)grep -v -f file1 file2
功能:输出文件2中的内容,但是剔除包含在文件1中的内容
下面我们来看一个应用:
[root@SOR_SYS hahah]# cat a
1
4
05766798608
05766798608
6
7
[root@SOR_SYS hahah]# cat b
05766798607
05766798608
05766798609
[root@SOR_SYS hahah]# grep -v -f b a |tee 222 | wc -l
4
[root@SOR_SYS hahah]# cat 222
1
4
6
7
PS:
tee语法:tee [-a] [-i] [File…]
作用:相当于echo加>的作用,将标准输入输出到标准输入的同时写入文件
-a:(add)不覆盖原来的内容,添加到文件的后面
-i:(ignore)没完成则不被打断
列出文本文件slayers.story的内容,同时复制3份副本,文件名称分别为ss-copy1、ss-copy2、ss-copy3:
cat slayers.story |tee ss-copy1 ss-copy2 ss-copy3
(3.)grep -F -f file1 file2
功能:可以把文件2中存在文件1的行输出
但是我做了一个试验,如果文件1中没有重复的行,结果是对的!如果有重复的行,结果和没有重复的行是一样的!
我想达到的目的是 文件1放的是手机号的前7位,文件2放的是手机号前7位 和 所代表的省份,输出结果然后统计文件1每个省有多少个手机号码??
[root@SOR_SYS hahah]# cat file1
11111
22222
11111
22222
33333
44444
55555
[root@SOR_SYS hahah]# cat file2
11111 bj
22222 hb
33333 hn
44444 nm
55555 xm
66666 mk
[root@SOR_SYS hahah]# grep -F -f file1 file2
11111 bj
22222 hb
33333 hn
44444 nm
55555 xm
[root@SOR_SYS hahah]#
看来这个是无法实现了,file1中有2个11111和2个22222,即如果file1有重复的行,还重复输出。
[root@SOR_SYS hahah]# join -1 2 -2 1 <(sort file1|uniq -c) <(sort file2)
11111 2 bj
22222 2 hb
33333 1 hn
44444 1 nm
55555 1 xm