my %data; while () { chomp; my ($k, $v) = split /,\s+/; push @{ $data{$k} }, $v; } for my $contig (sort keys %data) { my %uniq = map { $_ => 1 } map { s/_.*//; $_ } @{ $data{$contig} }; print "$contig = "; print join ' ', sort keys %uniq; print "\n"; } __DATA__ contig_8, maxima_contig_63500 contig_8, orange_scaffold_0026 contig_8, clementine_scaffold_6 contig_8, ponkan_scaffold_27456 contig_8, medica_contig_12945 contig_8, maxima_contig_235908 contig_8, ponkan_scaffold_144138 contig_9, maxima_contig_63500 contig_9, orange_scaffold_0026 contig_9, clementine_scaffold_6 contig_9, ponkan_scaffold_27456 contig_9, medica_contig_12945 contig_9, maxima_contig_235908 contig_9, ponkan_scaffold_144138 contig_9, ponkan_scaffold_144138