Версия perl:
use strict;
use warnings;
my %data;
while (my $line = <DATA>) {
chomp($line);
my @row = split(/\s/, $line);
my $key = $row[1] . $row[2];
push @{$data{$key}}, $row[0];
}
my $max = 0;
for my $key (keys %data) {
if (scalar @{$data{$key}} > $max) {
$max = scalar @{$data{$key}};
}
}
{
my @times;
push @times, "time" . $_ for (1 .. $max);
myFormat("field1", "field2", "nbrepeated", @times);
}
for my $key (keys %data) {
my ($f1, $f2) = split (//, $key);
my $nr = $#{$data{$key}};
my @times = @{$data{$key}};
for (my $i = 0; $i < $max; $i++) {
if (! defined $times[$i] ) {
$times[$i] = 0;
}
}
myFormat($f1, $f2, $nr, @times);
}
sub myFormat {
printf "%-8s %-8s %-12s %-8s ", shift, shift, shift, shift;
for my $line (@_) {
printf "%-8s ", $line;
}
print "\n";
}
__DATA__
1.00 3 4
93.00 2 3
105.00 0 2
119.00 0 2
122.00 1 4
202.00 1 3
207.00 1 2
210.00 1 4
236.00 0 1
237.00 0 4
237.00 0 2
240.00 1 3
243.00 2 3
243.00 3 4
243.00 0 3
275.00 0 4
275.00 2 4
353.00 0 3
361.00 1 4
411.00 0 1
412.00 1 3
425.00 0 3
426.00 0 4
455.00 1 4
464.00 0 3
520.00 0 4
560.00 1 3
561.00 1 4
581.00 0 2
Создает вывод:
field1 field2 nbrepeated time1 time2 time3 time4 time5
0 1 1 236.00 411.00 0 0 0
0 4 3 237.00 275.00 426.00 520.00 0
1 2 0 207.00 0 0 0 0
1 4 4 122.00 210.00 361.00 455.00 561.00
0 2 3 105.00 119.00 237.00 581.00 0
3 4 1 1.00 243.00 0 0 0
0 3 3 243.00 353.00 425.00 464.00 0
2 4 0 275.00 0 0 0 0
2 3 1 93.00 243.00 0 0 0
1 3 3 202.00 240.00 412.00 560.00 0
Вывод не отсортирован.Сортировка не создаст проблем, если вы укажете, как вы хотите ее отсортировать.