use strict; use warnings; open my $inFH, q{<}, \ <<'EOD' or die qq{open: << HEREDOC: $!\n}; 1,XYZ,desc,PDF 2,YGH,desc,KMN 1,XYZ,desc,QFZ EOD my %ids; while ( <$inFH> ) { chomp; my ( $key, $value ) = m{^(.*,)(.*)$}; push @{ $ids{ $key } }, $value; } print qq{$_@{ [ join q{,}, @{ $ids{ $_ } } ] }\n} for keys %ids; close $inFH or die qq{close: << HEREDOC: $!\n};