use strict; use warnings; use Tie::File; my $infile = q{noa.txt}; my $wanted_re = qr{ \A (?> ( Pass \s \# | Elapsed \s Time \s+ : \s+ | CPU \s Time \s+ : \s+ | Virtual \s memory \s size \s+ : \s+ | Resident \s set \s size \s+ : \s+ | Major \s page \s faults \s+ : \s+ ) ( [\d.]+ ) ) }msx; my $last_stat_re = qr{ \A Major \s page \s faults \s+ : \s+ \z }msx; tie my @indata, q{Tie::File}, $infile or die $!; for my $line (@indata) { next if $line !~ $wanted_re; print $2; print $1 =~ $last_stat_re ? qq{\n} : q{, }; } untie @indata; #### $ cat noa.txt ... Pass #123 ... ... Elapsed Time : 1753.2 sec CPU Time : 753.2 sec ... Virtual memory size : 4472.6 MB Resident set size : 4362 MB ... Major page faults : 7153 ... Pass #the salt ... Pass #124 ... ... Elapsed Time : 9753.2 sec CPU Time : 953.2 sec ... Virtual memory size : 9472.6 MB Resident Evil Resident set size : 9362 MB ... Major page faults : 9153 ... #### $ noa.pl 123, 1753.2, 753.2, 4472.6, 4362, 7153 124, 9753.2, 953.2, 9472.6, 9362, 9153