perl按hash值排序并返回名次 20

比如说这样的文件:a0.1b0.3c0.2d0.3e0.4想要排序后得到这样的文件a0.11c0.22b0.33d0.33e0.45也就是说按数字的大小排序,然后还要返回... 比如说这样的文件:
a 0.1
b 0.3
c 0.2
d 0.3
e 0.4
想要排序后得到这样的文件
a 0.1 1
c 0.2 2
b 0.3 3
d 0.3 3
e 0.4 5
也就是说按数字的大小排序,然后还要返回名次,数字大小一样的名次要保证一样。
其中第一列的字母是唯一的。
展开
 我来答
ace_fei
2012-06-11 · TA获得超过2013个赞
知道小有建树答主
回答量:734
采纳率:100%
帮助的人:717万
展开全部
#!/bin/env perl
my @data = map {$_->[0]} sort{$a->[1] <=> $b->[1]} map{[ $_, (split)[1] ]} <DATA>;
my $line=1;
my $rank=$line;
my $flag=undef;
for (@data)
{
chomp;
if ($flag != (split)[1])
{
$flag = (split)[1];
$rank = $line;
}
print "$_\t$rank\n";
$line++;
}
__DATA__
a 0.1
b 0.3
c 0.2
d 0.3
e 0.4
ba_du_co
2012-06-13 · TA获得超过937个赞
知道小有建树答主
回答量:191
采纳率:0%
帮助的人:274万
展开全部
#!/usr/bin/perl

my ( $i, $j ) = ( 0, 1 );
my @a = sort { $a->[1] <=> $b->[1] } map { [split] } <DATA>;
for my $r ( 1 .. @a ) {
print join( "\t", @{ $a[ $r - 1 ] }, $i == $a[ $r - 1 ][1] ? $j : $r ),
"\n";
( $i, $j ) = ( $a[ $r - 1 ][1], $r );
}
__DATA__
a 0.1
b 0.3
c 0.2
d 0.3
e 0.4
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
isweargod
2012-06-12 · TA获得超过155个赞
知道答主
回答量:30
采纳率:0%
帮助的人:11.9万
展开全部
#!usr/bin/perl -w
my ($file,$out)=@ARGV;
open FILE,$file or die "$!";
open OUT,"+>$out" or die "$!";
my %count;
my %number;
my $i=1;
while (<FILE>)
{
chomp;
my @array =split(/\s+/,$_);
if (exists $count{$array[1]})
{
$number{"$array[0]\t$array[1]"}=$count{$array[1]};
$i++;

}
else
{
$number{"$array[0]\t$array[1]"}=$count{$array[1]}=$i;
$i++;
}
my $keys = "$array[0]\t$array[1]";
print OUT "$keys\t$number{$keys}\n";

}

close FILE;
close OUT;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
liucy1983
2012-06-09 · TA获得超过288个赞
知道小有建树答主
回答量:299
采纳率:0%
帮助的人:211万
展开全部
考题或面试题?

先说你自己有什么思路吗
追问
我的思路是先排序(已经排好了)然后按行读入文件,创建一个新的变量表示名次,如果数值没出现过,名次就等于行号,如果出现过了就等于上一个值的名次。
但是俺不会写。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式