use strict; use warnings; my $data = <) { chomp; next unless length; my @columns = split ','; $numColumns ||= @columns; # Assume first row has correct column count $origins{$columns[1]}[$columns[2] - 1] = \@columns; } close $inFile; for my $oKey (sort keys %origins) { my $origin = $origins{$oKey}; my $lastAdded = -1; # Fake up present flag for +/- 8 lines around real data for my $pip (0 .. $#$origin) { next if $pip <= $lastAdded or ! defined $origin->[$pip]; my $first = $pip > 8 ? $pip - 8 : 0; my $last = $pip + 8; $last = $#$origin if $last > $#$origin; for my $index ($first .. $last) { next if defined $origin->[$index]; @{$origin->[$index]}[0 .. $numColumns - 1] = ('', $oKey, $index + 1, ('') x $numColumns); } $lastAdded = $last; } # Now output the result for my $pip (0 .. $#$origin) { my $row = $origin->[$pip]; if (defined $row) { # pip exists in original file print join (",", @$row, '1'), "\n"; } else { # pip doesn't exist in original file print ",$oKey,", $pip + 1, ',' x ($numColumns - 2), "0\n"; } } }