Aqui está um rápido script Perl que deve fazer o trabalho para você:
#!/usr/bin/perl
use strict;
my %result;
my @data;
my %data;
my @degrees;
my $infile = shift() || die "Usage: $0 <file>\n";
# Read source data from input file
open IN, '<', $infile
or die "Couldn't open data file: $!\n";
while (my $line = <IN>) { chomp $line; push @data, $line; };
close IN;
# Convert data lines to hash
foreach my $line (@data) {
my ($count, $degree) = split(/\s+/, $line);
$data{$degree}++;
};
# Get sorted degrees for count-up iteration
@degrees = sort { $a <=> $b } keys %data;
# Iterate degrees, adding each one's system count to result for this degree
# and all higher degrees
for (my $i = 0; $i < scalar(@degrees); $i++) {
my $degree = $degrees[$i];
my $count = $data{$degree};
for (my $j = $i; $j < scalar(@degrees); $j++) {
$result{$degrees[$j]} += $count;
};
};
# Output result counts
foreach my $degree (sort { $a <=> $b } keys %result) {
print "$result{$degree} $degree\n";
};
Esse script exigirá memória considerável para grandes conjuntos de dados de entrada; ele absorve todo o arquivo de entrada antes de operá-lo, porque não parece que o arquivo de entrada está classificado e é necessário classificar os dados por grau antes de operá-lo. Dito isto, deve fazer o trabalho para você muito bem - deixe-me saber se isso não acontecer!