$ perl -Mstrict -Mwarnings -E ' open my $inFH, q{<}, \ <; }; close $inFH or die $!; print for map { $_->[ 0 ] } sort { $a->[ 1 ] <=> $b->[ 1 ] } map { [ $_, m{\A(\d+)} ] } split m{(?<=\n)(?=\d)}, $input;' 1 [...] [line1] [line2] 2 [...] [line1] [line2] [line3] 2 [...] [line1] [line2] 3 [...] [line1] $