免费注册 查看新帖 |

Chinaunix

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

perl求教:根据key值计算两个文本文件的匹配件数 [复制链接]

论坛徽章:
4
程序设计版块每日发帖之星
日期:2015-10-10 06:20:00每日论坛发贴之星
日期:2015-10-10 06:20:00程序设计版块每日发帖之星
日期:2015-10-11 06:20:00程序设计版块每日发帖之星
日期:2015-10-25 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-01-10 23:49 |只看该作者 |倒序浏览
请教各位!

有两个文本文件:aaa.txt和bbb.txt
以aaa.txt中的ID列为Key值,和bbb.txt中的每行的逗号后面与@baidu.com之间的值相对比,
如果aaa.txt文件中ID列的值有重复的话,只算一条。
计算出aaa.txt中ID列的值与
bbb.txt中的逗号后面与@baidu.com前面的值相同的件数(行数)。

请教这个用perl如何实现?多谢!

aaa.txt
#aaaa,#bbbb,#ID
5a17b,123,a
5a17b,123,a
5a17b,123,c
5a17b,123,d
5a17b,123,e
5a17b,123,f
5a17b,123,g
5a17b,123,h

bbb.txt
2013-11-01 00:02:26,a@baidu.com
2013-11-01 00:02:26,weer323eow@baidu.com
2013-11-01 00:02:26,asd534ewwe@baidu.com
2013-11-01 00:02:26,c@baidu.com
2013-11-01 00:02:26,m323_nopqr@baidu.com
2013-11-01 00:02:26,d@baidu.com
2013-11-01 00:02:26,w5eweorgo@baidu.com

论坛徽章:
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
2 [报告]
发表于 2014-01-11 00:14 |只看该作者
  1. open my $A, 'aaa';
  2. open my $B, 'bbb';
  3. my %A = map { /,(\w+)$/, 1 } <$A>;
  4. my $sum;

  5. while (<$B>) {
  6.     my ($k) = /,(\w+)@/;
  7.     $sum++ if $A{$k};
  8. }

  9. say $sum;

复制代码

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
3 [报告]
发表于 2014-01-12 01:44 |只看该作者
  1. open F1, "a" or die;
  2. open F2, "b" or die;
  3. my ( %h, $n );
  4. map { chomp; $h{(split /,/)[2]} ++ } <F1>;
  5. map { $h{(split /[,@]/)[1]} && $n ++ } <F2>;
  6. say $n;
复制代码

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
4 [报告]
发表于 2014-01-12 17:35 |只看该作者
各位前辈。我震惊了。

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
5 [报告]
发表于 2014-01-12 17:35 |只看该作者
各位前辈。我震惊了。

论坛徽章:
4
程序设计版块每日发帖之星
日期:2015-10-10 06:20:00每日论坛发贴之星
日期:2015-10-10 06:20:00程序设计版块每日发帖之星
日期:2015-10-11 06:20:00程序设计版块每日发帖之星
日期:2015-10-25 06:20:00
6 [报告]
发表于 2014-01-14 11:11 |只看该作者
回复 3# yestreenstars

谢谢回复。

我在linux环境下跑了一下程序,报出如下信息:
Can't call method "say" without a package or object reference at ./perltool.pl line 16, <$B> line 9.
-----------------------------------------------------------------
  1 #!/usr/bin/perl
  2
  3 use 5.8.8;
  4
  5
  6 open my $A, 'aaa.txt';
  7 open my $B, 'bbb.txt';
  8 my %A = map { /,(\w+)$/, 1 } <$A>;
  9 my $sum=0;
10
11 while (<$B>) {
12     my ($k) = /,(\w+)@/;
13     $sum++ if $A{$k};
14 }
15
16 say $sum;
---------------------------------------
请问是不是前面要加上use 哪个package?

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
7 [报告]
发表于 2014-01-14 11:17 |只看该作者
回复 6# robinhappiness
use 5.010;

   

论坛徽章:
4
程序设计版块每日发帖之星
日期:2015-10-10 06:20:00每日论坛发贴之星
日期:2015-10-10 06:20:00程序设计版块每日发帖之星
日期:2015-10-11 06:20:00程序设计版块每日发帖之星
日期:2015-10-25 06:20:00
8 [报告]
发表于 2014-01-14 11:20 |只看该作者
回复 7# yestreenstars


    Perl v5.10.0 required--this is only v5.8.8, stopped at ./perltool_yes.pl line 3.
BEGIN failed--compilation aborted at ./perltool_yes.pl line 3.

哭,好像版本不是v5.10.0
有什么好的办法请赐教!

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
9 [报告]
发表于 2014-01-14 11:27 |只看该作者
回复 8# robinhappiness
改成print就好啦,这么简单的问题,你有基础吗?
  1. print "$sum$/";
复制代码

论坛徽章:
4
程序设计版块每日发帖之星
日期:2015-10-10 06:20:00每日论坛发贴之星
日期:2015-10-10 06:20:00程序设计版块每日发帖之星
日期:2015-10-11 06:20:00程序设计版块每日发帖之星
日期:2015-10-25 06:20:00
10 [报告]
发表于 2014-01-14 12:59 |只看该作者
本帖最后由 robinhappiness 于 2014-01-14 13:00 编辑

回复 9# yestreenstars


    不好意思,刚接触perl,请各位高手多多指点。
请教一下,如果aaa.txt和bbb.txt有重复的ID存在的情况下,
比方说aaa.txt中的ID中有两个a时,与bbb.txt中@前面的值匹配时,只算匹配上一件的情况下,这个逻辑应该怎么改?谢谢。

也就是说不管aaa.txt或者bbb.txt中有多少重复的相同的ID值,重复的只按照一件来计算。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP