use strict; use warnings; my %result; # Hash of Arrays my $headline = ; # ignore while (my $line =) { my ($gene,$sample) = split /\s+/, $line; push @{$result{$gene}},$sample; } for my $gene (sort keys %result) { print join "\t", $gene, @{$result{$gene}}; print "\n"; } __DATA__ Gene_name sample gene_A sample_1 gene_B sample_1 gene_C sample_1 gene_B sample_2 gene_C sample_2 gene_A sample_3 #### gene_A sample_1 sample_3 gene_B sample_1 sample_2 gene_C sample_1 sample_2