use strict; use warnings; my $str = <)) { chomp $line; my ($name, $set, $value) = split /\s+/, $line; next if !defined $value; $rows{$name}{$set} = $value; ++$sets{$set}; } my @setNames = sort keys %sets; print join ("\t", 'Name', @setNames), "\n"; for my $rowName (sort keys %rows) { print join ("\t", $rowName, map {defined $_ ? $_ : ''} @{$rows{$rowName}}{@setNames}), "\n"; } #### Name SET1 SET2 SET3 AA 0 1 0 BB 0 0 CC 2 3