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"; }