免费注册 查看新帖 |

Chinaunix

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

已解决!谢谢!排序的问题 [复制链接]

论坛徽章:
3
2015亚冠之武里南联
日期:2015-07-29 12:14:352015年亚冠纪念徽章
日期:2015-08-12 14:28:272015亚冠之德黑兰石油
日期:2015-09-09 17:15:52
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-10-23 15:49 |只看该作者 |倒序浏览
本帖最后由 54red 于 2015-11-02 10:28 编辑

我一个hash_test键值是这样的chr1:378格式,我用语句:
foreach my $data_ref_2 (sort {$a cmp $b} keys(%hash_test)) {
       
        print $data_ref_2."\t";}

sort {$a <=> $b} keys(%hash_test) 结果也不对,
求助大家!我想要的结果格式是:
chr1:100
chr2:3
chr2:4
chr10:35
chr10:89
chr22:3
chrX:45

结果排的不是我想要的:                        
chr10:101544447
chr10:64573771
chr11:118898436
chr11:1775399
chr11:45937267
chr12:103234245
chr12:56398118
chr13:103527850
chr13:26273385
chr14:105167807
chr15:28419713
chr15:42703931
chr15:52605941
chr16:29825126
chr16:55862762
chr16:56548501
chr17:10600810
chr17:48265495
chr18:42456670
chr18:72223591
chr19:36291105
chr1:114377568
chr1:154574820
chr1:169519049
chr1:203148633
chr1:27105588
chr1:53676401
chr20:31022959
chr22:36623731
chr2:152402446
chr2:179600563
chr2:179621477
chr2:25194771
chr2:71840504
chr3:123451773
chr5:177422876
chr5:90119324
chr6:170871034
chr7:128487866
chrX:130420415
chrX:135961587
chrX:140096916
chrX:140993912
chrX:153063113
chrX:17705850
chrX:49061611
chrX:69510335
chrX:73811761

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
2 [报告]
发表于 2015-10-23 15:58 |只看该作者
<=> 比较数字的大小
cmp 比较字符串每个字符编码的大小

而你需要的规则是先把字符串分3段,比较第二段数字大小,如果第二段是字符则比较字符大小,第二段一样比较第三段数字大小。
这么复杂的规则你觉得靠试错法能试出来吗?还是你认为有种语言内置这样的排序规则

论坛徽章:
3
2015亚冠之武里南联
日期:2015-07-29 12:14:352015年亚冠纪念徽章
日期:2015-08-12 14:28:272015亚冠之德黑兰石油
日期:2015-09-09 17:15:52
3 [报告]
发表于 2015-10-23 16:09 |只看该作者
查查了查基础知识,共享给和我一样的人。
@articles = sort {sub rule} @array;
数字比较符: <, >, <=, >=, ==, <=>
字符串比较符:lt, gt, le, gr, eq, cmp

$a <=> $b 的返回值
$a 大于$b        1
$a 等于$b        0
$a 小于$b        -1

论坛徽章:
0
4 [报告]
发表于 2015-10-29 11:15 |只看该作者
output
  1. chr1:27105588
  2. chr1:53676401
  3. chr1:114377568
  4. chr1:154574820
  5. chr1:169519049
  6. chr1:203148633
  7. chr2:25194771
  8. chr2:71840504
  9. chr2:152402446
  10. chr2:179600563
  11. chr2:179621477
  12. chr3:123451773
  13. chr5:90119324
  14. chr5:177422876
  15. chr6:170871034
  16. chr7:128487866
  17. chr10:64573771
  18. chr10:101544447
  19. chr11:1775399
  20. chr11:45937267
  21. chr11:118898436
  22. chr12:56398118
  23. chr12:103234245
  24. chr13:26273385
  25. chr13:103527850
  26. chr14:105167807
  27. chr15:28419713
  28. chr15:42703931
  29. chr15:52605941
  30. chr16:29825126
  31. chr16:55862762
  32. chr16:56548501
  33. chr17:10600810
  34. chr17:48265495
  35. chr18:42456670
  36. chr18:72223591
  37. chr19:36291105
  38. chr20:31022959
  39. chr22:36623731
  40. chrA:73811763
  41. chrX:17705850
  42. chrX:49061611
  43. chrX:69510335
  44. chrX:73811761
  45. chrX:130420415
  46. chrX:135961587
  47. chrX:140096916
  48. chrX:140993912
  49. chrX:153063113
复制代码
code
  1. #!/usr/bin/perl
  2. use 5.010;

  3. sub SORT {
  4.     my $MAX = 4;   
  5.     # chr10: 1ength 10 = 2, chr100: length 100 = 3
  6.     map { $_->[0] }
  7.     sort { $a->[1] cmp $b->[1] || $a->[2] <=> $b->[2] }
  8.     map {
  9.         my ( $a, $b ) = split ':', substr $_, 3;   
  10.         # length 'chr' = 3
  11.         $a = sprintf "%0*s", $MAX, $a if ord($a) < 65;  
  12.         # ord A = 65
  13.         [ $_, $a, $b ]
  14.     } @_;
  15. }

  16. say SORT <DATA>;

  17. __DATA__
  18. chr10:101544447
  19. chr10:64573771
  20. chr11:118898436
  21. chr11:1775399
  22. chr11:45937267
  23. chr12:103234245
  24. chr12:56398118
  25. chr13:103527850
  26. chr13:26273385
  27. chr14:105167807
  28. chr15:28419713
  29. chr15:42703931
  30. chr15:52605941
  31. chr16:29825126
  32. chr16:55862762
  33. chr16:56548501
  34. chr17:10600810
  35. chr17:48265495
  36. chr18:42456670
  37. chr18:72223591
  38. chr19:36291105
  39. chr1:114377568
  40. chr1:154574820
  41. chr1:169519049
  42. chr1:203148633
  43. chr1:27105588
  44. chr1:53676401
  45. chr20:31022959
  46. chr22:36623731
  47. chr2:152402446
  48. chr2:179600563
  49. chr2:179621477
  50. chr2:25194771
  51. chr2:71840504
  52. chr3:123451773
  53. chr5:177422876
  54. chr5:90119324
  55. chr6:170871034
  56. chr7:128487866
  57. chrX:130420415
  58. chrX:135961587
  59. chrX:140096916
  60. chrX:140993912
  61. chrX:153063113
  62. chrX:17705850
  63. chrX:49061611
  64. chrX:69510335
  65. chrX:73811761
  66. chrA:73811763
复制代码

论坛徽章:
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
5 [报告]
发表于 2015-11-01 08:20 |只看该作者
回复 4# Okelani

some bug and modified ...
...
chrX:73811761
chrA:73811763

#!/usr/bin/perl
use strict;
use warnings;

sub chr_sort{
  #chr2:25194771
  #chr10:64573771
  #chrA:73811763
  #chrX:17705850
  
  map{$_->[0]}
  sort{$a->[1] cmp $b->[1]}
  map{
    my($sChr_num, $sVal) = split(':');
    $sChr_num =~ s/(\d+)/sprintf("%8d",$1)/e;
    [ $_, sprintf("%s:%20d",$sChr_num, $sVal) ];   
  } @_;
}

print chr_sort <DATA>;

   

论坛徽章:
3
2015亚冠之武里南联
日期:2015-07-29 12:14:352015年亚冠纪念徽章
日期:2015-08-12 14:28:272015亚冠之德黑兰石油
日期:2015-09-09 17:15:52
6 [报告]
发表于 2015-11-02 09:13 |只看该作者
本帖最后由 54red 于 2015-11-02 09:16 编辑

谢谢大家的帮助,我也用一个笨方法实现了,也贴出来!
foreach my $line (@{$data}) {
                    my $pos_real=$line->[0];#chrX:73962092
                    $pos_real=~/chr(.*):(\d+)/;
                    if ($1 eq "X"){ $hash_pos{23*10000000000+$2} = $line;}
                elsif($1 eq "Y"){ $hash_pos{24*10000000000+$2} = $line; }
                    else{$hash_pos{$1*10000000000+$2} = $line; }
         }
         foreach my $key_new (sort{$a <=>$b} (keys %hash_pos)) {
#############
}

论坛徽章:
0
7 [报告]
发表于 2015-11-10 11:10 |只看该作者
回复 5# jason680


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP