3

我想对大约 20M 行的大文件进行排序:

  • 在团队名称和
  • 然后降到最高分。

所以我可以得到每支球队的最高得分手。

我想考虑系统的资源。所以...

  1. 有没有办法在不将所有数据放入 Perl 中的哈希/数组的情况下做到这一点?
  2. 我们可以使用 Unix/Linux 排序实用程序来做到这一点吗?

如果是这样,你能告诉我怎么做吗?

我的输入文件将是以下格式的大约 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
.
.
.
4

3 回答 3

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/

于 2013-05-20T22:26:42.930 回答
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
于 2013-05-20T21:57:18.893 回答
2

我不认为您可以告诉sort在一列中升序排序并在另一列中降序排序。但是,您可以使用稳定排序选项sorts在管道中使用两个:-s

sort -t\| -rnk3 file.in | sort -st\| -k1
于 2013-05-20T22:14:20.210 回答