#! /usr/bin/perl -w

use strict;

# type => name mappings
my %names = ( 0 => "full ",
              1 => "hebdo",
              2 => "daily");
my %machines = ();

print "all sizes in MB\n";
printf "%-9s %-5s %10s %5s %10s\n", "mach/part", "type", "total", "count", "avg";

while (<>) {

  my ($size, $location) = split(/\s/, $_);

  if ($location =~ /^(.*)\/(.*)_([0-9]+)/) {
     my ($machine, $part, $type, $i) = ($1, $2, $3);
     if (!$location =~ /[^0-9][0-9]+$/) {
       $i = 0;
     } else {
       $i = $&;
     }
     if (!defined($machines{$machine})) {
       %{$machines{$machine}} = ();
     }
     if ($type > 1) {
       $type = 2; # group daily backups
     }
     if (!defined($machines{$machine}{$type})) {
       %{$machines{$machine}{$type}} = (); # size, count
     }
     if (!defined($machines{$machine}{$type}{$part})) {
       @{$machines{$machine}{$type}{$part}} = (0, 0); # size, count
     }
     my @tmp = @{$machines{$machine}{$type}{$part}};
     $tmp[0] += $size;
     $tmp[1]++;
     #print "$machine, $type, $part: (@tmp) $i\n";
     $machines{$machine}{$type}{$part} = \@tmp;
  } else {
     #print "bad du line: $_";
  }

}

while ( my ($machine, $types) = each %machines) {
  print $machine . "\n";
  my %avg;
  my $grand_total = 0;
  my %type_total;
  while ( my ($type, $parts) = each %{$types}) {
    while (my ($part, $size) = each %{$parts}) {
      my ($total, $count) = @{$size};
      $total /= 1024;
      printf "%9s %5s %10.2f %5d %10.2f\n", $part, $names{$type}, $total, $count, $total/$count;
      $grand_total += $total;
      $avg{$type} += $total/$count;
      $type_total{$type} += $total;
    }
  }
  print "totaux\n";
  while ( my ($type, $totals) = each %avg) {
    #my ($total, $count) = @{$totals};
    printf "%9s %5s %10.2f %5s %10.2f\n", "", $names{$type}, $type_total{$type},  "", $totals;
  }
  printf "    grand total: %9.2f\n\n", $grand_total;
}


syntax highlighted by Code2HTML, v. 0.9.1