#!/usr/bin/env perl -l use strict; use warnings; use Inline::Files; my @file_handles = \(*ANIMALS, *FRUITS, *VEGETABLES); my %data; for my $fh (@file_handles) { while (<$fh>) { my ($id, $type, $val1, $val2) = split; $data{in}{$type}{$id}{val1} += $val1; $data{in}{$type}{$id}{val2} += $val2; $data{subtotal}{$type}{val1} += $val1; $data{subtotal}{$type}{val2} += $val2; $data{total}{val1} += $val1; $data{total}{val2} += $val2; } } for my $type (sort keys %{$data{in}}) { print $type; for (sort keys %{$data{in}{$type}}) { print join("\t" => $_, @{$data{in}{$type}{$_}}{qw{val1 val2}}); } print join("\t" => 'Sub', @{$data{subtotal}{$type}}{qw{val1 val2}}); } print join("\t" => 'Tot', @{$data{total}}{qw{val1 val2}}); __ANIMALS__ A RACK 2 2 B RACK 2 2 C RACK 2 2 D RACK 2 2 __FRUITS__ A RACK 2 2 B RACK 2 2 C RACK 2 2 D RACK 2 2 __VEGETABLES__ E TACK 4 2 F TACK 4 2 G TACK 4 2 H TACK 4 2