#!/usr/bin/perl -w use strict; use Data::Dumper; my @FLDS = qw(ID name address city state zip phone matchkey); my @RFLDS = qw(address city state zip phone); my @UFLDS = qw(ID name); my %records; for(){ chomp; my %rec; @rec{@FLDS} = split/\|/; my %urec; @urec{@UFLDS} = @rec{@UFLDS}; my $key = $rec{matchkey}; defined($key) or die "This record has no key"; push @{ $records{$key}{'records'} }, \%urec; for(@RFLDS){ $records{$key}{$_} = $rec{$_} unless exists $records{$key}{$_}; } } for my $key (sort keys %records){ my %master = %{$records{$key}}; for(@{ $master{records} }){ my %rec = (%master, %$_); $rec{matchkey} = $key; print join('|', @rec{@FLDS}) . "\n"; } } print Dumper(\%records); __DATA__ 1|krazken|123 Main|BFE|AR|72210|555-2345|1 2|kraken||||||1 3|krayken|||||555-2345|1 #### 1|krazken|123 Main|BFE|AR|72210|555-2345|1 2|kraken|123 Main|BFE|AR|72210|555-2345|1 3|krayken|123 Main|BFE|AR|72210|555-2345|1 $VAR1 = { '1' => { 'state' => 'AR', 'zip' => '72210', 'address' => '123 Main', 'city' => 'BFE', 'phone' => '555-2345', 'records' => [ { 'ID' => '1', 'name' => 'krazken' }, { 'ID' => '2', 'name' => 'kraken' }, { 'ID' => '3', 'name' => 'krayken' } ] } };