#!/usr/bin/perl use strict; use warnings; my (@objects, @sets, @unsorted_records, @headers, %have_header, $results); foreach my $file (sort glob("./records*.dat")) { open(my $fh, '<', $file) or die "$file: $!\n"; my @items = <$fh>; close($fh); push @sets, \@items; } my $i = 0; foreach my $set (@sets) { foreach my $record (@$set) { next if $record =~ /^#/; chomp($record); my @ids = split m!\|!, $record; shift @ids; if (@ids > 3) { $have_header{$record}++; push @headers, $record if $have_header{$record} >= 2; } next unless @ids == 3; $objects[$i]->{$ids[0]}{$ids[1]} = $ids[2]; } $i++; } for (my $i = 0; $i < @objects; $i++) { foreach my $record (keys %{$objects[$i]}) { foreach my $item (keys %{$objects[$i]->{$record}}) { $results->{$record}{$item} += $objects[$i]->{$record}{$item}; } } } foreach my $record (keys %$results) { foreach my $item (sort { $a <=> $b } keys %{$results->{$record}}) { my $new_record = "|$record|$item|$results->{$record}{$item}"; push @unsorted_records, $new_record; } } my @sorted_records = sort { (split m!\|!, $a)[2] <=> (split m!\|!, $b)[2] } @unsorted_records; local $" = "\n"; print "@headers", @headers ? "\n" : ''; print "@sorted_records", @sorted_records ? "\n" : '';