my @order = (); my %values; while () { my ($col1, $col2) = split; push @order, $col1 unless exists $values{$col1}; push @{$values{$col1}}, $col2 } # and now print it: foreach my $col1 (@order) { { print join("\t", $col1, @{$values{$col1}}), "\n"; }