my @columns_to_group_on = (2, 3); my @columns_to_average = (5, 6); #### my $group = join("/", @columns[@columns_to_group_on]); my @row = @columns[@columns_to_average]; #### ++$data{$group}{ROWCNT}; $data{$group}{SUMS}[$_] += $row[$_] for 0 .. $#row; #### my @avg = [ map { $_/$data{$group}{ROWCNT} } @{$data{$group}{SUMS}} ]; print "GROUP $group: [", join(", ", @avg), "]\n"; #### $ perl pm_121222.pl Collecting the data into groups: 1: xxxx A 1 G L -135.185 178.150 179.885 0.000 0.000 0.000 1 0.000 P 1 F 1 2: xxxx A 2 S L -49.668 -31.158 177.985 0.000 0.000 0.000 1 0.000 P 1 F 1 3: xxxx A 3 M L -84.632 -45.215 177.518 0.000 0.000 0.000 1 0.000 P 1 F 1 4: xxxx A 1 G L -115.240 -69.349 -171.360 0.000 0.000 0.000 1 0.000 P 1 F 2 5: xxxx A 2 S L -84.776 -143.809 173.303 0.000 0.000 0.000 1 0.000 P 1 F 2 6: xxxx A 3 M L -50.674 158.544 177.747 0.000 0.000 0.000 1 0.000 P 1 F 2 7: xxxx A 1 G L -106.682 126.232 177.885 0.000 0.000 0.000 1 0.000 P 1 F 3 8: xxxx A 2 S L -20.124 24.502 -179.585 0.000 0.000 0.000 1 0.000 P 1 F 3 9: xxxx A 3 M L -60.092 2.018 -178.549 0.000 0.000 0.000 1 0.000 P 1 F 3 10: xxxx A 1 G L -115.172 -16.017 -179.179 0.000 0.000 0.000 1 0.000 P 1 F 4 11: xxxx A 2 S L -143.860 148.913 -179.781 0.000 0.000 0.000 1 0.000 P 1 F 4 12: xxxx A 3 M L -81.755 -23.354 -174.564 0.000 0.000 0.000 1 0.000 P 1 F 4 13: xxxx A 1 G L -71.907 147.690 -178.617 0.000 0.000 0.000 1 0.000 P 1 F 5 14: xxxx A 2 S L -81.417 52.986 179.983 0.000 0.000 0.000 1 0.000 P 1 F 5 15: xxxx A 3 M L -83.126 -56.051 178.109 0.000 0.000 0.000 1 0.000 P 1 F 5 Generating the report: GROUP 1/G AVGS [-108.8372, 73.3412] GROUP 2/S AVGS [-75.969, 10.2868] GROUP 3/M AVGS [-72.0558, 7.1884]