排序一个巨大的文件

时间:2013-05-20 21:49:01

标签: perl sorting ksh

我想要排序一个大约20M行的大文件:

  • 以团队名称升序
  • 然后降到最高分。

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

我想体谅系统的资源。所以......

  1. 有没有办法在不将所有数据放入Perl中的哈希/数组的情况下执行此操作?
  2. 我们可以使用Unix / Linux排序实用程序吗?
  3. 如果是这样,你能告诉我该怎么做吗?

    我的输入文件大约是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
    .
    .
    .
    

3 个答案:

答案 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