[SHELL we talk 之五]求两个文件的交集,用diff实现

jackxiang 2010-9-10 19:53 | |
文件A和文件B分别存放着两组数,现要求出两组数的交集。
文件格式是每个数字占一行。
如,文件A为:                        文件B为:
        12                                         23      
        23                                         32
        45                                         56
        56

则交集应该为:
      23  
         56

这里主要是学习diff这个命令的用途。

diff,比较文件,它是通过逐行比较两个文本文件的方式来找到两者不同的地方的。

输出结果中,以<开头的是属于第一个参数指定的文件的,以>开头的是属于第二个参数指定的文件的。

通过grep命令得到以<开头的即属于第一个文件但不属于第二个文件的行,并输出到一个临时文件中。

再以第一个文件与这个临时文件用diff来比较,同样方法,得到的就是两个文件的交集了。

要注意,比较的两个文件必须先进行排序。


如下:
[~/diff]# cat a.txt
12
23
45
56

[~/diff]# cat b.txt
23
32
56

[~/diff]# diff a.txt b.txt |grep -r "<"   //管道输入到c.txt,去掉<
< 12
< 45

c.txt:
12
45
到C文件!

[~/diff]# diff a.txt c.txt |grep -r "<"
< 23
< 56

结果是:
23
56



代码页可以,如此啊:


#######################################
#  author:hjack
#  Date:2006.7.16
#  function:找两个文件中数的交集
#  usage:intersection file1 file2
#  History:
#######################################

usage(){
    echo "Usage:$0 file1 file2"
    exit 1;
}

testInput(){
    REQUESTARG=2
    if [ $# -ne $REQUESTARG ]; then
        Usage "$@"
    fi
}

getIntersection(){
    seed=`date +%s`
    sort $1 -un > /tmp/$1.$seed
    sort $2 -un > /tmp/$2.$seed
    diff /tmp/$1.$seed /tmp/$2.$seed | grep ^\< | awk '{print $2}' > /tmp/$1.$seed.only
    diff /tmp/$1.$seed /tmp/$1.$seed.only | grep ^\< | awk '{print $2}'
}


main(){
  testInput "$@"
  getIntersection "$@"
}

main "$@"



改写测试成功,如下,加入dos2unix,很重要!


#######################################
#  author:hjack
#  Date:2006.7.16
#  function:找两个文件中数的交集
#  usage:intersection file1 file2
#  History:
#######################################

usage(){
    echo "Usage:$0 file1 file2"
    exit 1;
}

testInput(){
    REQUESTARG=2
    if [ $# -ne $REQUESTARG ]; then
        Usage "$@"
    fi
}

getIntersection(){
    seed=`date +%s`
    dos2unix $1
    dos2unix $2
    sort $1 -un > /tmp/$1.$seed
    sort $2 -un > /tmp/$2.$seed
    diff /tmp/$1.$seed /tmp/$2.$seed | grep ^\< | awk '{print $2}' > /tmp/$1.$seed.only
    diff /tmp/$1.$seed /tmp/$1.$seed.only | grep ^\< | awk '{print $2}'
}


main(){
  testInput "$@"
  getIntersection "$@"
}

main "$@"



dos2unix diff.sh   这个命令运行一下。

亲自实践:
特别提醒:Linux与Windows文本格式之间的转化,Linux提供了两种文本格式相互转化的命令:dos2unix和unix2dos,dos2unix把"\r\n"转化成"\n",unix2dos把"\n"转化成"\r\n"。

不做如上操作,diff会出现问题!!!!!


diff antacardsort.txt anta_userqq_onlinesort.txt|grep "<"|awk -F"< " '{print $2}' > a.txt
sort a.txt >> aa.txt
diff antacardsort.txt asort.txt |grep "<"|awk -F"< " '{print $2}' > diffresultA.txt



diff antacardsort.txt anta_userqq_onlinesort.txt|grep ">"|awk -F"> " '{print $2}' > b.txt
sort b.txt >> bb.txt
diff anta_userqq_onlinesort.txt bb.txt  |grep "<"|awk -F"< " '{print $2}' > diffresultB.txt


diff antacardsort.txt asort.txt |grep ^\< | awk '{print $2}'

diff antacardsort.txt asort.txt |grep "<"|awk -F"< " '{print $2}'
一个意思!

结果:
diffresultA.txt == diffresultB.txt
自己务必参考:http://www.jackxiang.com/post/1370/

来源:http://www.gdutbbs.com/thread-76831-1-1.html

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/3484/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2020-12-1 16:33
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]