perl -nle "$x++ if 0==$.%4;$a[$x].=$_}{for(@a){next unless/Range/;s/ST/ST,/;/\s(\d+)(\w) - \d+(\w)\W/;$n=$1;for $l(qq($2)..qq($3)){print s/\(.*\)/$n$l, /r}}" add-data.txt 432 10TH ST, APT 2A, BROOKLYN NY 10598-6601 432 10TH ST, APT 2B, BROOKLYN NY 10598-6601 432 10TH ST, APT 3A, BROOKLYN NY 10598-6601 432 10TH ST, APT 3B, BROOKLYN NY 10598-6601 432 10TH ST, APT 4A, BROOKLYN NY 10598-6605 432 10TH ST, APT 4B, BROOKLYN NY 10598-6605 432 10TH ST, APT 5A, BROOKLYN NY 10598-6605 432 10TH ST, APT 5B, BROOKLYN NY 10598-6605 432 10TH ST, APT 5C, BROOKLYN NY 10598-6605 432 10TH ST, APT 5D, BROOKLYN NY 10598-6605 #### perl -MO=Deparse -nle "$x++ if 0==$.%4;$a[$x].=$_}{for(@a){next unless/Range/;s/ST/ST,/;/\s(\d+)(\w) - \d+(\w)\W/;$n=$1;for $l(qq($2)..qq($3)){print s/\(.*\)/$n$l, /r}}" add-data.txt BEGIN { $/ = "\n"; $\ = "\n"; } LINE: while (defined($_ = readline ARGV)) { chomp $_; ++$x if 0 == $. % 4; $a[$x] .= $_; } { foreach $_ (@a) { next unless /Range/; s/ST/ST,/; /\s(\d+)(\w) - \d+(\w)\W/; $n = $1; foreach $l ("$2" .. "$3") { print s/\(.*\)/$n$l, /r; } } } -e syntax OK