忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT 视频 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 439 | 回复: 3

perl如何判断一个数值是否在一个范围内 [复制链接]

论坛徽章:
0
发表于 2017-06-03 18:29 |显示全部楼层
perl新人,求教大神~~如何看一个文件中的一列数值是否在另一个文件中两列数值的范围内。比如a文件中第三列数字是1027;2637;3847;4827等等等等,b文件中第三四列是1019,1038; 2342,2436; 3812,3942; 4716,4785等等等等。目的是只要a文件某行第一列和b文件某行第二列有相同信息,比如都是chr1,且a文件中该行第三列的数字包含在b文件中该行的三四列数字范围中,就输出a文件中该列数字的这行信息到c文件,输出b文件中这个数字范围的这行信息到d文件。比如a文件第一行第一列与b文件第一行第二列都是chr1,且1027符合1019到1038的范围,就输出a文件中1027的这行的所有信息到c文件,输出b文件中1019,1038的这行的所有信息到d文件。多谢大神!

论坛徽章:
7
巳蛇
日期:2013-11-28 09:22:59天秤座
日期:2014-10-25 15:40:452015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之德黑兰石油
日期:2015-07-15 08:46:452015亚冠之平阳省
日期:2015-11-08 16:27:53白银圣斗士
日期:2015-11-14 09:58:12
发表于 2017-06-30 10:41 |显示全部楼层
给示例文件,比你描述好懂多了……

论坛徽章:
302
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2017-06-30 12:28 |显示全部楼层
a File:
#ID    Name    Number
chr1    Armani    1027
chr2    Prada    7070
chr3    Chanel    2637
chr4    Dior    3487
chr5    NewBalance  4343
b File:
#ID    Name    Section1    section2
chr2    Prada    4000    5000
chr1    Armani    1019    1038
chr4    Dior    4716    4785
chr3    Chanel    3812    3942

codes:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. sub Load{
  5.     local @ARGV = @_;
  6.     my $bData = {};
  7.     while(<>){
  8.         next if(/\A#/);
  9.         my ($id, $name, $sec1, $sec2) = split;
  10.         $bData->{$id} = [$_, [$sec1, $sec2]];
  11.     }
  12.     $bData;
  13. }

  14. my $b = Load(pop);
  15. my %hFH = ();
  16. grep {open($hFH{$_}, '>', $_)} ('c', 'd');
  17. while(<>){
  18.     next if(/\A#/);
  19.     my ($id, $name, $num) = split;
  20.     next if(!exists($b->{$id}));
  21.     next if($b->{$id}[-1][0] > $num or $b->{$id}[-1][-1] < $num);
  22.     select($hFH{'c'});
  23.     print;
  24.     select($hFH{'d'});
  25.     print($b->{$id}[0]);
  26. }
  27. select(STDOUT);
  28. grep {close($hFH{$_})} keys %hFH;
复制代码

perl abc.pl a b

head -n 2 c d
-------------------------------



论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
发表于 2017-07-04 13:24 |显示全部楼层
这是处理什么问题?最少在最近5年我都看到过3次。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP