免费注册 查看新帖 |

Chinaunix

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

求大神指点:第一列相同的情况下排序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-08-14 23:30 |只看该作者 |倒序浏览
文件1
A   a    1
A   b   2
A   c    5
A   f     8
B   i    7
B   h    5
B   g     2

文件2
a   10
c   100
g   1000
i     1
h    15

文件2中的ac都在文件1的A类中;ghi在B类中:
文件2中属于A类的a c由第二列从大到小的顺序为c a,如何相应地依据c a顺序调整文件1中A类行之间的顺序?
A   c    5
A   b   2
A   a    1
同理,B类的gih根据文件2大小顺序是ghi,相应地调整文件1中B类行的顺序
B   g   2
B   h    5
B   i     7
求大神指点!谢谢。

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
2 [报告]
发表于 2016-08-15 08:30 |只看该作者
排序结果?

不在 文件2 如何排序?
A   b   2
A   f     8

论坛徽章:
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
3 [报告]
发表于 2016-08-15 18:16 |只看该作者
这样?
  1. #!perl
  2. use strict;
  3. use autodie qw{open close};

  4. my $file1 = 'file1.txt';
  5. my $file2 = 'file2.txt';

  6. # read data
  7. my %weight_of = ();
  8. open my $fh2, '<', $file2;
  9. while ( defined(my $line = readline $fh2) ) {
  10.     chomp $line;
  11.     my @parts  = split /\s+/, $line;
  12.     my $char   = $parts[0];
  13.     my $weight = $parts[1];
  14.     $weight_of{$char} = $weight;
  15. }
  16. close $fh2;

  17. # again...
  18. my $data_href = +{};
  19. open my $fh1, '<', $file1;
  20. while ( defined(my $line = readline $fh1) ) {
  21.     chomp $line;
  22.     my @parts = split /\s+/, $line;
  23.     my $class = $parts[0];
  24.     my $char  = $parts[1];

  25.     $data_href->{$class}->{$char} = $line;
  26. }
  27. close $fh1;

  28. # sort
  29. for my $class (sort keys %{ $data_href }){
  30.     my @sorted_chars = sort {
  31.         $weight_of{$b} <=> $weight_of{$a}
  32.     } keys %{ $data_href->{$class} };

  33.     my @lines = map { $data_href->{$class}->{$_} } @sorted_chars;

  34.     # print sorted lines
  35.     print "$_$/" for @lines;
  36. }

  37. __END__
复制代码

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
4 [报告]
发表于 2016-08-15 23:00 |只看该作者
请大神出来跳个舞吧.

论坛徽章:
0
5 [报告]
发表于 2016-08-16 01:30 |只看该作者
楼主问题表述的不清,看好久也未必理解了。
我说一下解决思路:
1、读入文件1,取第一列为A的数据的第二列值,比如说第2行是c,到2中去查对应的值,c对应100,然后加入文件1该行的头部,就是2列:
100,“ A   b   2”
2、所有行处理完毕,再按第1列排序,排完序后,删除第一列,就得到结果。
3、A/B分开处理后,再合并。

论坛徽章:
0
6 [报告]
发表于 2016-08-19 10:50 |只看该作者
stanley_tam 发表于 2016-08-15 18:16
这样?



谢谢大神,果然可以了。
请问
my $data_href = +{}是什么意思?

论坛徽章:
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
7 [报告]
发表于 2016-08-19 11:01 |只看该作者
一起学习中,大神不敢当。
哈希引用,为了避免编译猜测我这个为代码块,前面加了一个+号避免歧义。另外href就是提醒自己这是hash reference
回复 6# 321wangke321


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP