open INFILE, '<', 'infile.txt' or die("Can't read: $!"); # each 'line' is a chunk with 'filename =' delimiting. local $/ = 'filename ='; while () { s/^s\+//s; # remove starting whitespace. # use a regex capture -- slow but simple. my ($filename, $data) = ($1, $2) if m/^(\w+)\s+pred=\s+(.*?)\s+$/s; open my $OUT, '>', $filname or die("Can't write $filename: $!"); foreach ( split(/\s+|\n/, $data) ) { next unless m/^[-.0-9][0-9.]+/; #skip any empty or malformed lines print $OUT $_; } }