免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8079 | 回复: 16
打印 上一主题 下一主题

如何在两个文件中比较 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-25 14:53 |只看该作者 |倒序浏览
有个问题:
file1:
10.5.246.3
10.5.247.130
10.5.247.2
10.5.248.130
10.5.248.2
10.5.249.3


file2:
地点      ip
经一路        10.5.246.0
小河村        10.5.247.0
大厦        10.5.10.0

以file1里的ip为关键字,从file2中搜索出包含此ip地址的前三段数字的行,并将地点和ip显示在一个新文件file3中,
结果举例:
经一路 10.5.246.3
小河村 10.5.247.130
小河村 10.5.247.2
          10.5.248.130
          10.5.248.2
          10.5.249.3

不知该如何编写啊,采用的perl是windows版本,没有unix下的grep等命令。

论坛徽章:
6
卯兔
日期:2013-11-26 14:52:02丑牛
日期:2014-02-19 18:01:25卯兔
日期:2014-05-20 20:34:06白羊座
日期:2014-05-23 13:39:232015亚冠之大阪钢巴
日期:2015-08-07 20:57:582015亚冠之大阪钢巴
日期:2015-09-02 14:09:09
2 [报告]
发表于 2013-07-25 16:07 |只看该作者
本帖最后由 只是一个红薯 于 2013-07-25 16:09 编辑

  1. #!/usr/bin/perl
  2. use 5.016;
  3. use strict;
  4. use warnings;
  5. use Tie::File;
  6. tie my @a,'Tie::File', '1.txt';
  7. tie my @b,'Tie::File', '2.txt';
  8. tie my @c,'Tie::File', '3.txt';
  9. my %hash;
  10. my @tmp=@a;
  11. for my $bb(@b){
  12.     next unless $bb=~/\d/;
  13.     my($adr,$ip)=split /\s+/,$bb;
  14.     duu($ip);   
  15.     for my $aa(@a){
  16.     if(duu($ip) eq duu($aa)){
  17.         @tmp = grep { $_ ne $aa } @tmp;
  18.         $hash{$aa}=$adr ;
  19.     }
  20. }  
  21. }
  22. $hash{$_}='' for (@tmp);
  23. sub duu{
  24.     my $t=shift;
  25.     my($a,$b,$c,$d)=split /\./,$t;
  26.     ($a,$b,$c);
  27. }
  28. push @c,$hash{$_}."\t".$_ for  keys %hash;
  29. @c=reverse sort @c;
  30. untie @a;
  31. untie @b;
  32. untie @c;
复制代码

论坛徽章:
0
3 [报告]
发表于 2013-07-25 16:31 |只看该作者
谢谢,这么快,我学习一下程序代码,还看不太懂:)

论坛徽章:
0
4 [报告]
发表于 2013-07-25 20:24 |只看该作者
还有两个地方看不明白:
第一:
if(duu($ip) eq duu($aa)){

        @tmp = grep { $_ ne $aa } @tmp;

        $hash{$aa}=$adr ;
以上是说生成一个hash数组,但是中间这一行有什么用呢?
第二:
$hash{$_}='' for (@tmp);
是两个单引号吗?起什么作用呢?

论坛徽章:
3
摩羯座
日期:2013-09-04 12:01:36申猴
日期:2013-10-23 12:12:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34
5 [报告]
发表于 2013-07-25 21:23 |只看该作者
回复 4# zljjg2000


@tmp = grep { $_ ne $aa } @tmp;
grep和map的功能基本差不多 都是从grep{}后的数组中筛选出满足{}中的条件,并且返回一个数组

$hash{$_}='' for (@tmp);
这句话的意思是将列表@tmp中的每个元素作为哈希hash的key 并将这些key对应的value清空

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
6 [报告]
发表于 2013-07-26 01:52 |只看该作者
也来试试 ~
  1. #!/usr/bin/perl

  2. open my $F1, 'file1';
  3. open my $F2, 'file2';
  4. open my $F3, '>', 'file3';

  5. my %f2 = map { reverse /(\S+)\s+(.*?)\d+$/ } <$F2>;
  6. while (<$F1>) {
  7.     my ($k) = /(.*\.)/;
  8.     print $F3 $f2{$k} ? "$f2{$k}\t$_" : "\t$_";
  9. }
复制代码

论坛徽章:
3
摩羯座
日期:2013-09-04 12:01:36申猴
日期:2013-10-23 12:12:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34
7 [报告]
发表于 2013-07-26 07:18 |只看该作者
回复 6# rubyish


太妙了! 值得细细分析
有点象文言文或者古诗

论坛徽章:
6
卯兔
日期:2013-11-26 14:52:02丑牛
日期:2014-02-19 18:01:25卯兔
日期:2014-05-20 20:34:06白羊座
日期:2014-05-23 13:39:232015亚冠之大阪钢巴
日期:2015-08-07 20:57:582015亚冠之大阪钢巴
日期:2015-09-02 14:09:09
8 [报告]
发表于 2013-07-26 10:03 |只看该作者
奇怪,用komodo编译,要加个括号...
rubyish 发表于 2013-07-26 01:52
  1. my %f2 = map { reverse (/(\S+)\s+(.*?)\d+$/) } <$F2>;
复制代码
也来试试 ~

论坛徽章:
0
9 [报告]
发表于 2013-07-26 12:12 |只看该作者
再请教:
@tmp = grep { $_ ne $aa } @tmp;
中的$_指的哪个变量啊

论坛徽章:
3
摩羯座
日期:2013-09-04 12:01:36申猴
日期:2013-10-23 12:12:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34
10 [报告]
发表于 2013-07-26 12:27 |只看该作者
回复 9# zljjg2000


    grep { $_ ne $aa } @tem
$_是后面的数组中的每个元素,类似于for循环吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP