我想要排序一个大约20M行的大文件:
所以我可以获得每支球队最高的得分手。
我想体谅系统的资源。所以......
如果是这样,你能告诉我该怎么做吗?
我的输入文件大约是20M行,格式如下
Chicago Bulls|Michael Jordan|38
LA Lakers|Kobe Bryant|32
Chicago Bulls|Steve Kerr|16
LA Lakers|Paul Gasol|20
LA Lakers|Shaquile ONeal|19
Chicago Bulls|Scottie Pippen|23
.
.
.
答案 0 :(得分:3)
您不需要排序。
#!/usr/bin/perl
use warnings; use strict;
my %high_score;
while (<DATA>) {
chomp;
my ($team_name, $player, $score) = split(/\|/);
for ($high_score{$team_name}{$player}) {
$_ = $score
unless $_ && $_ > $score
}
}
for my $team_name (sort keys %high_score) {
my %team_scores = %{ $high_score{$team_name} };
my @top_players = sort { $team_scores{$b} <=> $team_scores{$a} } (keys %team_scores);
my $n = 0;
for my $player (@top_players) {
print "$team_name, $player high score: $team_scores{$player}\n";
last if ++$n >= 2;
}
}
__DATA__
Chicago Bulls|Michael Jordan|38
Chicago Bulls|Scottie Pippen|23
Chicago Bulls|Poor Joe|10
Chicago Bulls|Steve Kerr|16
LA Lakers|Kobe Bryant|32
LA Lakers|Paul Gasol|20
LA Lakers|Shaquile ONeal|19
编辑:(1)更新要求(2)s / while / for /
答案 1 :(得分:2)
我不知道sort
是否会破坏这么大的文件,但您可以尝试执行以下命令。它用管道分隔字段,然后按第一个字段和第三个字段按相反的顺序排序,(-r
),后代:
sort -t'|' -k1,1 -k3,3nr infile
它产生:
Chicago Bulls|Michael Jordan|38
Chicago Bulls|Scottie Pippen|23
Chicago Bulls|Steve Kerr|16
LA Lakers|Kobe Bryant|32
LA Lakers|Paul Gasol|20
LA Lakers|Shaquile ONeal|19
答案 2 :(得分:2)
我认为你不能告诉sort
在一列中升序并在另一列中降序。但是,您可以使用sorts
选项在管道中使用两个-s
进行稳定排序:
sort -t\| -rnk3 file.in | sort -st\| -k1