#!/usr/bin/perl use strict; # https://perlmonks.org/?node_id=11146593 use warnings; use List::AllUtils qw( zip_by sum ); my @mapped = ("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"); local $_ = join '', map "$_\n", @mapped; 1 while s/^((?:\S+\s+){3})\b\K(.*\n)((?:.*\n)*)\1(.*\n)/ join(' ', zip_by { sum @_ } map [ split ], $2, $4) . "\n$3"/me; s/(.*\n)\K/ $1 =~ tr| \n|-|cr /e; printf scalar( ('%-11s' x 6 . "\n") x tr/\n// ), split; #### Account Entity Unit Jan Feb Mar ------- ------ ---- --- --- --- Account01 Entity01 Unit01 12 15 18 Account02 Entity02 Unit02 10 11 12