use strict; use warnings; my %hash = (); my @order = (); foreach () { chomp; my ($h,$d,$txt) = split /,/; my $k = join ',', $h, $d; push @order, $k unless exists $hash{$k}; $hash{$k} .= ' ' if $hash{$k}; $hash{$k} .= $txt; } foreach my $k (@order) { print "$k,$hash{$k}\n"; } __DATA__ H123456,20151209,THIS IS A TEST H123456,20151209,TO COMBINE ALL H123456,20151209,MY MATCHING LINES H123456,20151209,INTO THE FIRST LINE H123456,20151209,THAT MATCHES. H654321,20151209,MATCH LINES FOR THIS H654321,20151209,ACCT INTO THE H654321,20151209,TOP LINE OF THE ACCT H432165,20151209,SINGLE LINE FOR THIS ONE #### H123456,20151209,THIS IS A TEST TO COMBINE ALL MY MATCHING LINES INTO THE FIRST LINE THAT MATCHES. H654321,20151209,MATCH LINES FOR THIS ACCT INTO THE TOP LINE OF THE ACCT H432165,20151209,SINGLE LINE FOR THIS ONE