use strict; use warnings; use Data::Dumper; my (@results,%hoh,$current); while (my $line = ) { chomp $line; next unless $line; my ($col_name,$rest) = split(/\s/,$line,2); if ($col_name =~ m/^partnm_/) { push(@results,$col_name); $hoh{$col_name}{'partnm'} = $rest; $current = $col_name; next; } next unless $current; $hoh{$current}{$col_name} = $rest; } print Dumper(\%hoh); # to see what we've got so far my @cols = qw( partnm prlot prwafer prbin sspec fab ); my $hline = join(',',@cols); print "$hline\n"; for my $id (@results) { my $hash = $hoh{$id}; my @elems; for my $col (@cols) { my $val = $hash->{$col} || 'empty'; push(@elems,$val); } my $line = join(',',@elems); print "$line\n"; } __DATA__ partnm_1 101 prlot prlot_1 prwafer prwafer_1 prbin prbin_1 sspec sspec_1 fab fab_1 partnm_2 102 sspec sspec_2 fab fab_2 partnm_3 103 #### partnm,prlot,prwafer,prbin,sspec,fab 101,prlot_1,prwafer_1,prbin_1,sspec_1,fab_1 102,empty,empty,empty,sspec_2,fab_2 103,empty,empty,empty,empty,empty