use strict; use warnings; my %AB; while () { chomp; my ($id, $name, $desc, $app) = split /\s*,\s*/; $AB{$id}{app} .= ",$app"; $AB{$id}{name_desc} = "$name, $desc"; } for (keys %AB) { $AB{$_}{app} =~ s/^,// } # remove leading comma for my $id (sort keys %AB) { print "$id, $AB{$id}{name_desc}, $AB{$id}{app} \n"; } __DATA__ 1, XYZ, desc, PDF 1, XYZ, desc, QFZ 2, YGH, desc, LMN