免费注册 查看新帖 |

Chinaunix

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

perl 源文件的一个域和另外的文件两个域做比较 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-27 15:12 |只看该作者 |倒序浏览
a.unl
123456|1111|11111|fd|fdfd|dfdf|dfdfd|dfdfd|dfdfd|dfdfd|dfdfdfd|fdfd|fdfD|fd|dfdfd|dfdfd|dfdfd|dfdfd|dfdf|dfdf|
124556|1111|11111|fd|fdfd|dfdf|dfdfd|dfdfd|dfdfd|dfdfd|dfdfdfd|fdfd|fdfD|fd|dfdfd|dfdfd|dfdfd|dfdfd|dfdf|dfdf|
234333|2222|22222|fd|fdfd|dfdf|dfdfd|dfdfd|dfdfd|dfdfd|dfdfdfd|fdfd|fdfD|fd|dfdfd|dfdfd|dfdfd|dfdfd|dfdf|dfdf|
235454|2222|22222|fd|fdfd|dfdf|dfdfd|dfdfd|dfdfd|dfdfd|dfdfdfd|fdfd|fdfD|fd|dfdfd|dfdfd|dfdfd|dfdfd|dfdf|dfdf|

b.unl
123|124|

c.unl
234|235|

根据a.unl文件的第1域的前3个字符和b.unl c.unl两个文件的两个域做比较(b.unl和c.unl文件的第一个域是比较的最小值,第二个域是比较的最大值),如果上面的数据:
a.unl的第一域的前3个字符是123,123符合大于等于b.unl文件的第1个域,也符合小于等于b.unl文件的第2个域,即:123(b文件)>=123(a文件)<=124(b文件)
a.unl的第2条数据:也是符合b.unl文件   123(b文件)>=124(a文件)<=124(b文件)
a.unl的第3条数据:符合c.unl文件   234(c文件)>=234(a文件)<=235(c文件)
a.unl的第4条数据:也是符合c.unl文件   234(c文件)>=235(a文件)<=235(c文件)

最终的结果是:匹配到b.unl文件的范围的数据放入new1.unl;匹配到c.unl文件的范围的数据放入new2.unl文件。

注意:a.unl和b.unl、c.unl文件的数据很有很多,这里就不一一列出来。

论坛徽章:
0
2 [报告]
发表于 2011-07-27 16:31 |只看该作者
自己顶一下

论坛徽章:
1
辰龙
日期:2014-05-15 19:37:15
3 [报告]
发表于 2011-07-27 17:54 |只看该作者
  1. #!/usr/bin/perl
  2. use strict;
  3. use File::Slurp;
  4. use Data::Dumper;

  5. my %bHash;
  6. for my $line ( read_file("b.unl") ) {
  7.     if ($line =~ /^(\d+)\|(\d+)/) {
  8.         $bHash{$1} = $2
  9.     }
  10. }

  11. my %cHash;
  12. for my $line ( read_file("c.unl") ) {
  13.     if ($line =~ /^(\d+)\|(\d+)/) {
  14.         $cHash{$1} = $2
  15.     }
  16. }

  17. open my $new1_fh, ">", "new1.unl" or die "$!";
  18. open my $new2_fh, ">", "new2.unl" or die "$!";
  19. for my $line ( read_file("a.unl") ) {
  20.     my ($number) = $line =~ /^(\d\d\d)/;

  21.     for my $key ( keys %bHash ) {
  22.         print $new1_fh $line if $number >= $key and $number <= $bHash{$key};
  23.     }

  24.     for my $key ( keys %cHash ) {
  25.         print $new2_fh $line if $number >= $key and $number <= $cHash{$key};
  26.     }
  27. }
  28. close $new1_fh;
  29. close $new2_fh;
复制代码

论坛徽章:
0
4 [报告]
发表于 2011-07-28 11:11 |只看该作者

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

  4. my %hash;
  5. my ($b_min,$b_max,$c_min,$c_max);
  6. open my $fh_a,"<","a.unl" or die "Cannot open file:$!\n";
  7. open my $fh_b_in,"<","b.unl" or die "Cannot open file:$!\n";
  8. open my $fh_b_out,">","new1.unl" or die "Cannot write file:$!\n";
  9. open my $fh_c_in,"<","c.unl" or die "Cannot open file:$!\n";
  10. open my $fh_c_out,">","new2.unl" or die "Cannot write file:$!\n";

  11. while (<$fh_a>) {
  12.         chomp;
  13.         $hash{$_} = substr((split /\|/)[0],0,3);
  14. }

  15. while(<$fh_b_in>) {
  16.         ($b_min,$b_max) = (split /\|/);
  17.         for (keys %hash) {
  18.                 if ( $hash{$_} >= $b_min and $hash{$_} <= $b_max ) {
  19.                         print $fh_b_out "$_\n";
  20.                 }               
  21.         }       
  22. }

  23. while(<$fh_c_in>) {
  24.         ($c_min,$c_max) = (split /\|/);
  25.         for (keys %hash) {
  26.                 if ( $hash{$_} >= $c_min and $hash{$_} <= $c_max ) {
  27.                         print $fh_c_out "$_\n";
  28.                 }       
  29.         }
  30. }
复制代码
晕了,好像打开的句柄数比较多~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP