免费注册 查看新帖 |

Chinaunix

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

新手求一个perl脚本 [复制链接]

论坛徽章:
2
拜羊年徽章
日期:2015-03-03 16:15:432015年亚洲杯之韩国
日期:2015-03-12 20:29:56
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-05 05:29 |只看该作者 |倒序浏览
刚开始学perl,很多问题不清楚。问题如下:
有两个txt文件,一个(1.txt)里面内容如下:
    2401   1.3775641e-02
    2402   1.3779020e-02
    2403   1.3786890e-02
    2404   1.3800292e-02
            .
            .
    12000  -8.4433077e-06
另外一个文件(2.txt)里面内容如下:
2401   2.5793660e-02   2.6011014e+00   0.0000000e+00   
2402   7.7383786e-02   2.6011612e+00   0.0000000e+00   
2403   1.2898135e-01   2.6012766e+00   0.0000000e+00   
2404   1.8058990e-01   2.6014414e+00   0.0000000e+00  
            .
            .
12000   2.9747996e+00   9.9742689e+00   0.0000000e+00
根据1.txt文件第一列的数据对文档进行如下分组:2401+n*60, 2402+n*60,……. 2460+n*60,共分为60组,每组是160行2列的数据,然后从每个分组中找出对应值最大的那个编号,比如第一组中找到值最大的编号是6961,也就是2401+76*60,其对应值7.2904140e-02在这一组中最大。再打开文件2.txt,在这个文件中找出编号6961,把这个编号和其对应的数据及其在1.txt中的值输出为一个txt文件,以此类推,继续写出剩下的59组数据,将所有60组数据写成一个文件。
请高手帮忙写个脚本,非常感谢!

论坛徽章:
1
15-16赛季CBA联赛之北控
日期:2016-08-05 14:22:52
2 [报告]
发表于 2013-08-05 14:20 |只看该作者
本帖最后由 唐归来 于 2013-08-05 21:18 编辑
  1. use strict;
  2. use warnings;
  3. use List::Util qw(max);

  4. open IN1,"< ./cu/1.txt" or die"$!";
  5. open IN2,"< ./cu/2.txt" or die"$!";
  6. open OUT,"> ./cu/result.txt" or die"$!";

  7. my $ref1 = {};
  8. my %groups = ();
  9. while (<IN1>) {
  10.     chomp;
  11.         $_ =~ s/^\s+//;
  12.         my @arr = split/\s+/;
  13.         my $group = ($arr[0]-2400)%60;
  14.         $ref1->{$group}->{$arr[1]}->{$arr[0]} = $.;
  15.         push @{$groups{$group}},$arr[1];
  16. }
  17. close IN1;
  18. my %hash = ();
  19. while (<IN2>) {
  20.     chomp;
  21.         $_ =~ s/^\s+//;
  22.         my @arr = split(/\s+/,$_,2);
  23.         $hash{$arr[0]} = $arr[1];
  24. }
  25. close IN2;
  26. foreach my $key (keys %hash) {
  27.     print "$key\n";
  28. }
  29. foreach my $groupnum (0..59) {
  30.     my $maxnum = max(@{$groups{$groupnum}});
  31.         foreach my $tag (keys %{$ref1->{$groupnum}->{$maxnum}}) {
  32.             print OUT "$tag\t$hash{$tag}\t$maxnum\n";
  33.         }
  34. }
  35. close OUT;
复制代码

论坛徽章:
2
拜羊年徽章
日期:2015-03-03 16:15:432015年亚洲杯之韩国
日期:2015-03-12 20:29:56
3 [报告]
发表于 2013-08-05 15:51 |只看该作者
谢谢唐归来,我运行了你的程序,但结果如下
        11941        12000   2.9747996e+00   9.9742689e+00   0.0000000e+00
        11942        12000   2.9747996e+00   9.9742689e+00   0.0000000e+00
        11943        12000   2.9747996e+00   9.9742689e+00   0.0000000e+00
                           .
                           .
        12000        12000   2.9747996e+00   9.9742689e+00   0.0000000e+00                      .
结果的第一列是2.txt中最后的60行,第二列是最后一行的行号,3、4、5列是12000对应的值。可能是我表述不清,我想要的结果是象下列格式
         6961        2.5021810e-02   5.8496518e+00   0.0000000e+00    7.2904140e-02
第一组中编号6961对应的值最大,找到2.txt中6961对应的数据是   6961   2.5021810e-02   5.8496518e+00   0.0000000e+00, 把它输出并把其在1.txt中对应的值7.2904140e-02附在后面。附件中是1.txt和2.txt,还请唐归来帮忙修改运行一下。非常感谢。

txt.zip

152.32 KB, 下载次数: 8

txt 文件

论坛徽章:
1
15-16赛季CBA联赛之北控
日期:2016-08-05 14:22:52
4 [报告]
发表于 2013-08-05 21:19 |只看该作者
上面的代码我已经改过了,运行的结果如下:
6840        2.9744420e+00   5.7073851e+00   0.0000000e+00        6.6506580e-02
6901        2.5033820e-02   5.8124666e+00   0.0000000e+00        7.6074019e-02
6902        7.5101212e-02   5.8124418e+00   0.0000000e+00        7.6065123e-02
6903        1.2516841e-01   5.8123922e+00   0.0000000e+00        7.6044112e-02
6904        1.7523500e-01   5.8123178e+00   0.0000000e+00        7.6010361e-02
6905        2.2530162e-01   5.8122196e+00   0.0000000e+00        7.5965121e-02
6906        2.7536818e-01   5.8120956e+00   0.0000000e+00        7.5921610e-02
6907        3.2543358e-01   5.8119478e+00   0.0000000e+00        7.5887859e-02
6908        3.7549725e-01   5.8117771e+00   0.0000000e+00        7.5865090e-02
6909        4.2555845e-01   5.8115840e+00   0.0000000e+00        7.5857162e-02
6910        4.7561687e-01   5.8113685e+00   0.0000000e+00        7.5862661e-02
6911        5.2567112e-01   5.8111315e+00   0.0000000e+00        7.5879768e-02
6912        5.7571948e-01   5.8108740e+00   0.0000000e+00        7.5904123e-02
6913        6.2576163e-01   5.8105989e+00   0.0000000e+00        7.5923935e-02
6914        6.7580122e-01   5.8103065e+00   0.0000000e+00        7.5935088e-02
6915        7.2584146e-01   5.8099937e+00   0.0000000e+00        7.5954445e-02
6916        7.7588183e-01   5.8096609e+00   0.0000000e+00        7.5990304e-02
6917        8.2591856e-01   5.8093071e+00   0.0000000e+00        7.6006934e-02
6918        8.7595379e-01   5.8089352e+00   0.0000000e+00        7.5992450e-02
6919        9.2598683e-01   5.8085470e+00   0.0000000e+00        7.5986773e-02
6920        9.7601283e-01   5.8081436e+00   0.0000000e+00        7.6009251e-02
6921        1.0260302e+00   5.8077269e+00   0.0000000e+00        7.6037064e-02
6922        1.0760397e+00   5.8073015e+00   0.0000000e+00        7.6028928e-02
6923        1.1260471e+00   5.8068657e+00   0.0000000e+00        7.5981386e-02
6924        1.1760552e+00   5.8064160e+00   0.0000000e+00        7.5883560e-02
6925        1.2260678e+00   5.8059483e+00   0.0000000e+00        7.5695448e-02
6926        1.2760829e+00   5.8054647e+00   0.0000000e+00        7.5444259e-02
6927        1.3260940e+00   5.8049669e+00   0.0000000e+00        7.5172685e-02
6928        1.3760962e+00   5.8044586e+00   0.0000000e+00        7.4856788e-02
6929        1.4260924e+00   5.8039432e+00   0.0000000e+00        7.4474782e-02
6930        1.4760885e+00   5.8034153e+00   0.0000000e+00        7.4027233e-02
6931        1.5260901e+00   5.8028679e+00   0.0000000e+00        7.3487267e-02
6932        1.5760982e+00   5.8023000e+00   0.0000000e+00        7.2880767e-02
6873        1.6266760e+00   5.7641811e+00   0.0000000e+00        7.2619587e-02
6874        1.6766896e+00   5.7636051e+00   0.0000000e+00        7.2654702e-02
6875        1.7266972e+00   5.7630191e+00   0.0000000e+00        7.2665095e-02
6876        1.7767025e+00   5.7624197e+00   0.0000000e+00        7.2672687e-02
6877        1.8267132e+00   5.7617998e+00   0.0000000e+00        7.2684526e-02
6878        1.8767290e+00   5.7611551e+00   0.0000000e+00        7.2709419e-02
6879        1.9267404e+00   5.7604914e+00   0.0000000e+00        7.2767153e-02
6880        1.9767411e+00   5.7598152e+00   0.0000000e+00        7.2843619e-02
6881        2.0267358e+00   5.7591262e+00   0.0000000e+00        7.2894514e-02
6882        2.0767355e+00   5.7584162e+00   0.0000000e+00        7.2890520e-02
6883        2.1267364e+00   5.7576809e+00   0.0000000e+00        7.2857112e-02
6884        2.1767237e+00   5.7569313e+00   0.0000000e+00        7.2770782e-02
6885        2.2266991e+00   5.7561727e+00   0.0000000e+00        7.2569303e-02
6886        2.2766695e+00   5.7554016e+00   0.0000000e+00        7.2230704e-02
6887        2.3266401e+00   5.7546129e+00   0.0000000e+00        7.1761608e-02
6888        2.3765996e+00   5.7538147e+00   0.0000000e+00        7.1186543e-02
6889        2.4265413e+00   5.7530198e+00   0.0000000e+00        7.0510164e-02
6890        2.4764729e+00   5.7522287e+00   0.0000000e+00        6.9746405e-02
6891        2.5263996e+00   5.7514372e+00   0.0000000e+00        6.8944536e-02
6832        2.5770671e+00   5.7128177e+00   0.0000000e+00        6.8702854e-02
6833        2.6269403e+00   5.7120719e+00   0.0000000e+00        6.8727195e-02
6834        2.6767778e+00   5.7113571e+00   0.0000000e+00        6.8758734e-02
6835        2.7265787e+00   5.7106748e+00   0.0000000e+00        6.8765156e-02
6836        2.7763424e+00   5.7100224e+00   0.0000000e+00        6.8674967e-02
6837        2.8260479e+00   5.7093978e+00   0.0000000e+00        6.8448596e-02
6838        2.8756533e+00   5.7087755e+00   0.0000000e+00        6.8025373e-02
6839        2.9251108e+00   5.7080688e+00   0.0000000e+00        6.7280672e-02
回复 3# yccpp


   

论坛徽章:
2
拜羊年徽章
日期:2015-03-03 16:15:432015年亚洲杯之韩国
日期:2015-03-12 20:29:56
5 [报告]
发表于 2013-08-05 23:24 |只看该作者
非常感谢,好人一生平安!  能不能帮忙解释一下这一行 $ref1->{$group}->{$arr[1]}->{$arr[0]} = $.; 刚开始学perl,没有看懂。

论坛徽章:
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
6 [报告]
发表于 2013-08-06 05:26 |只看该作者
这问题我纠结了一天,结果还是一直在纠结
问题 kan BU dong,还是一直 kan BU dong

论坛徽章:
1
15-16赛季CBA联赛之北控
日期:2016-08-05 14:22:52
7 [报告]
发表于 2013-08-06 08:20 |只看该作者
使用引用构建了一个多维的hash,一级键是组数,二级键是1.txt的第二列,三级键是1.txt第一列,$.代表行数,这里我是怕1.txt第二列中有重复数值就加了一个$. 回复 5# yccpp


   

论坛徽章:
6
卯兔
日期:2013-11-26 14:52:02丑牛
日期:2014-02-19 18:01:25卯兔
日期:2014-05-20 20:34:06白羊座
日期:2014-05-23 13:39:232015亚冠之大阪钢巴
日期:2015-08-07 20:57:582015亚冠之大阪钢巴
日期:2015-09-02 14:09:09
8 [报告]
发表于 2013-08-06 09:52 |只看该作者
大神是不睡觉的啊{:3_191:} 回复 6# rubyish


   

论坛徽章:
2
拜羊年徽章
日期:2015-03-03 16:15:432015年亚洲杯之韩国
日期:2015-03-12 20:29:56
9 [报告]
发表于 2013-08-06 14:58 |只看该作者
非常感谢唐归来及关注这个帖子的朋友,在论坛上学习了很多,谢谢。

论坛徽章:
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
10 [报告]
发表于 2013-08-07 05:20 |只看该作者
回复 8# 只是一个红薯


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP