my %mapping; while (<>) { my ($key, $value) = /^(.*?)=(.*)$/ or die "Cannot parse $_"; $mapping{$key}{$_} = 1 for split /, /, $value; } for my $word (sort keys %mapping) { my @aliases = sort keys %{$mapping{$word}}; print "$word=", join(", ", @aliases), "\n"; }