免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 清泉一边
打印 上一主题 下一主题

统计a文件中某个元素在b文件出现的次数 [复制链接]

论坛徽章:
1
羊年新春福章
日期:2015-04-28 20:40:58
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-08-13 18:10 |显示全部楼层 |倒序浏览
各位大神:
如果a.txt第一列与b.txt第二列相同,统计b.txt的第三列数与第四列数之间出现的A,B或C(a.txt的第三列)的次数。如果a.txt的第二列在b.txt的第三列与第四列之间,那么就把a.txt的第四列出现的次数加1。结果如下:
len            start  end  A  B  C
len_1        01        330        401  1   3   0
len_2        01        432        452  0   1   1
len_3        01        500        600  0  3    4

a.txt
01        333        A
01        369        B
01        387        B
01        400        B
01        416        B
01        450        C
01        455        B
01        466        B
01        468        B
01        471        C
01        504        B
01        506        B
01        508        C
01        522        C
01        523        B
01        577        C
01        600        C
01        607        A
02        609        B
02        645        B
.....
......

b.txt
len_1        01        330        401
len_2        01        432        452
len_3        01        500        600
......
......

谢谢各位大神!

论坛徽章:
1
羊年新春福章
日期:2015-04-28 20:40:58
2 [报告]
发表于 2016-08-13 18:52 |显示全部楼层
本帖最后由 清泉一边 于 2016-08-13 18:52 编辑
  1. #!/usr/bin/perl -w
  2. use strict;
  3. open (IN1,"C:\\Users\\lenovo\\Desktop\\a.txt") || die "no1";
  4. open (IN2,"C:\\Users\\lenovo\\Desktop\\b.txt")|| die "no2";
  5. print "len start  end  A  B  C";
  6. while (my $line = <IN1>){
  7. chomp $line;
  8. my @r = split /\t/,$line;
  9. my $a = 0;
  10. my $b = 0;
  11. my $c = 0;
  12.         while (<IN2>){
  13.         chomp;
  14.         my @s = split /\t/,$_;
  15.                         if ($s[0] eq $r[1] &&  $s[1]>=$r[2] && $s[1]<=$r[3] && $s[2] eq "A"){
  16.                            $a ++;
  17.                            }
  18.                  elsif ($s[0] eq $r[1] && $s[1]>=$r[2] && $s[1]<=$r[3] && $s[2] eq "B"){
  19.                            $b ++;
  20.                            }
  21.                  elsif ($s[0] eq $r[1] && $s[1]>=$r[2] && $s[1]<=$r[3] && $s[2] eq "C"){
  22.                            $c ++;
  23.                            }
  24.         }
  25. print "$line\t$a\t$b\t$c\n";
  26. }

  27. print "over";
复制代码
不知道错哪儿啦?哪位大神给看看~回复 1# 清泉一边


   

论坛徽章:
1
羊年新春福章
日期:2015-04-28 20:40:58
3 [报告]
发表于 2016-08-14 14:42 |显示全部楼层
的确是这个原因。但这样写的确耗时啊。回复 6# stanley_tam


   

论坛徽章:
1
羊年新春福章
日期:2015-04-28 20:40:58
4 [报告]
发表于 2016-08-14 14:44 |显示全部楼层
时间和内存不可兼得啊,while套while试了一下,时间太久了,这次文件不算太大,要时间,不要内存了~回复 13# 华小飞_Perl


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP