比较文件输出不同的内容

2012/10/26 14:48
阅读数 177


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

[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

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


展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部