工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 4347|回复: 1

[SHELL we talk 之五]求两个文件的交集

[复制链接]
发表于 2006-7-16 21:18 | 显示全部楼层 |阅读模式
文件A和文件B分别存放着两组数,现要求出两组数的交集。
文件格式是每个数字占一行。
如,文件A为:                        文件B为:
        12                                         23      
        23                                         32
        45                                         56
        56

则交集应该为:
      23  
      56



  1. #######################################
  2. #  author:hjack
  3. #  Date:2006.7.16
  4. #  function:找两个文件中数的交集
  5. #  usage:intersection file1 file2
  6. #  History:
  7. #######################################

  8. usage(){
  9.     echo "Usage:$0 file1 file2"
  10.     exit 1;
  11. }

  12. testInput(){
  13.     REQUESTARG=2
  14.     if [ $# -ne $REQUESTARG ]; then
  15.         Usage "$@"
  16.     fi
  17. }

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


  25. main(){
  26.   testInput "$@"
  27.   getIntersection "$@"
  28. }

  29. main "$@"

复制代码


迟点再补上程序的解释。
 楼主| 发表于 2006-7-21 22:09 | 显示全部楼层
这里主要是学习diff这个命令的用途。

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

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

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

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

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

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2024-5-4 04:23

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表