免费注册 查看新帖 |

Chinaunix

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

[算法] 数据的合并问题 [复制链接]

论坛徽章:
307
程序设计版块每周发帖之星
日期: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
21 [报告]
发表于 2015-12-04 18:50 |只看该作者
本帖最后由 sunzhiguolu 于 2015-12-04 19:32 编辑

回复 20# patagonia2
试下: (测试环境: Windows 7)

  1. tr -s [:blank:] < a.txt | sort -t" " -k2n -o a.txt
复制代码
代码如下:

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Tie::File;

  5. my ($sFileA, $sFileB, @aData) = ('File A Path', 'File B Path');
  6. tie (my @aFileA, 'Tie::File', $sFileA, mode => 'O_RDONLY');
  7. open (my $fhFileB, '<', $sFileB);
  8. while (<$fhFileB>){
  9.     my ($sB1, $sB2) = split;
  10.     foreach my $sLine (@aFileA){
  11.         my ($sA1, $sA2) = split /\s+/, $sLine;
  12.         unless (@aData){
  13.             @aData = ($sB1, $sA1, $sA2);
  14.         }else{
  15.             if (abs ($sA2 - $sB2) <= abs ($aData[-1] - $sB2)){
  16.                 if ($aData[-1] == $sA2){
  17.                     @aData = ($aData[0], $aData[1] . ' ' . $sA1, $aData[-1]);
  18.                     next;
  19.                 }
  20.                 $aData[1] = $sA1;
  21.                 $aData[-1] = $sA2;
  22.                 next;
  23.             }
  24.             last;
  25.         }
  26.     }
  27.     printf "%s %s\n", @aData[0,1];
  28.     @aData = ();
  29. }
  30. close ($fhFileB);
复制代码
输出结果如下:

  1. Q12 Babushkin
  2. D23 Azov
  3. Y11 Aznakayevo
  4. U10 Balashikha Balashov
  5. Q45 Babayevo
  6. A11 Bagrationovsk
  7. R08 Babayevo
  8. ZAA Babayevo
复制代码

论坛徽章:
307
程序设计版块每周发帖之星
日期: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
22 [报告]
发表于 2015-12-04 19:08 |只看该作者
回复 20# patagonia2
将代码的第 6 行:
'File A Path', 'File B Path' 替换成你自己的文件路径!

   

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
23 [报告]
发表于 2015-12-04 20:56 |只看该作者
回复 19# stanley_tam


大神 [   ]
加好友

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
24 [报告]
发表于 2015-12-04 21:29 |只看该作者
回复 13# stanley_tam

大神
大神我想问一个
感觉

如果

  1.         if ($num < $min) {
  2.             # only need to look for numbers greater than $num
  3.             my $new_num = $num;
  4.             while (1) {
  5.                 $new_num += 1;
  6.                 if (exists $a_data_href->{$new_num}) {
  7.                     $words_aref = $a_data_href->{$new_num};
  8.                     last;
  9.                 }
  10.             }
  11.         }
复制代码
可以

  1.         if ($num < $min) {
  2.             $words_aref = $a_data_href->{$min};

  3.         }
复制代码
我的理解哪里有偏差? 还请大神指点...
谢谢大神
   

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
25 [报告]
发表于 2015-12-05 10:42 |只看该作者
多谢大神指点
真是众里寻他千百度,蓦然回首。。。
  1. sub find_the_nearest {
  2.     # body...
  3.     my ($num, $a_data_href, $max, $min) = @_;
  4.     my $words_aref = [];

  5.     if (exists $a_data_href->{$num}) {
  6.         # if exactly matched
  7.         $words_aref = $a_data_href->{$num};
  8.     }
  9.     else {
  10.         if ($num < $min) {
  11.             $words_aref = $a_data_href->{$min};
  12.         }
  13.         elsif ($num > $max){
  14.             $words_aref = $a_data_href->{$max};
  15.         }
  16.         else {
  17.             # look for numbers both way
  18.             my $new_num_bigger  = $num;
  19.             my $new_num_smaller = $num;

  20.             while (1) {
  21.                 $new_num_bigger  += 1;
  22.                 $new_num_smaller -= 1;

  23.                 my @words = ();
  24.                 if (exists $a_data_href->{$new_num_bigger}) {
  25.                     push @words, @{ $a_data_href->{$new_num_bigger} };
  26.                 }

  27.                 if (exists $a_data_href->{$new_num_smaller}) {
  28.                     push @words, @{ $a_data_href->{$new_num_smaller} };
  29.                 }

  30.                 if (scalar @words) {
  31.                     $words_aref = \@words;
  32.                     last;
  33.                 }
  34.             }

  35.         }
  36.     }

  37.     return $words_aref;
  38. }
复制代码
回复 24# substr函数


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP