my %seen; while (<>) { chomp; my @fields = split('\|', $_); if (my $record = $seen{$fields[0]}) { ... append @fields to $record... } else { $seen{$fields[0]} = ...some data structure... } } for my $k (keys %seen) { my $record = $seen{$k}; # process $record } #### my %seen; $/ = "\n\n"; while (<>) { chomp; my ($idline, @letters) = split(/\n/, $_); my @fields = split('\|', $_); my $record = $seen{$fields[0]}; unless ($record) { $seen{$fields[0]} = $record = { idline => $idline, letters => [ @letters ] }; } else { push(@{$record->{letters}}, @letters); } } for keys (%seen) { print join("\n", $seen->{$_}->{idline}, @{$seen->{$_}->{letters}}, "\n"), "\n"; }