in reply to appending values based on criteria

Stuff all your data into a hash-of-hashes-of-arrays before printing it:
use warnings; use strict; my $line = readline(DATA); print $line; my %RepeatNumber; while (<DATA>) { chomp; my @obj = split /\|/; push @{ $RepeatNumber{ $obj[0] }{app1} }, $obj[2]; push @{ $RepeatNumber{ $obj[0] }{app2} }, $obj[3]; $RepeatNumber{ $obj[0] }{name} = $obj[1]; } for my $n (sort {$a <=> $b} keys %RepeatNumber) { my $app1 = join ',', @{ $RepeatNumber{$n}{app1} }; my $app2 = join ',', @{ $RepeatNumber{$n}{app2} }; print join('|', $n, $RepeatNumber{$n}{name}, $app1, $app2), "\n"; } __DATA__ id|Name|app1|app2 1|abc|234|231| 2|xyz|123|215| 1|abc|265|321| 3|asd|213|235|

Outputs:

id|Name|app1|app2 1|abc|234,265|231,321 2|xyz|123|215 3|asd|213|235

UPDATED: Use numeric sort (thanks AnomalousMonk)