#!/usr/bin/perl use strict; # https://perlmonks.org/?node_id=11146593 use warnings; use List::AllUtils qw( zip_by ); my %group_by; my @titles = split ' ', ; while( ) { my @parts = split; my %hash = zip_by { @_ } \@titles, \@parts; for ( qw( Jan Feb Mar ) ) { $group_by{ join ' ', @hash{ qw( Account Entity Unit ) } }{ $_ } += $hash{ $_ }; } } use Data::Dump 'dd'; dd \%group_by; __DATA__ Account Entity Unit Jan Feb Mar Account01 Entity01 Unit01 1 2 3 Account01 Entity01 Unit01 4 5 6 Account01 Entity01 Unit01 7 8 9 Account02 Entity02 Unit02 10 11 12 #### { "Account01 Entity01 Unit01" => { Feb => 15, Jan => 12, Mar => 18 }, "Account02 Entity02 Unit02" => { Feb => 11, Jan => 10, Mar => 12 }, }