perl -pe 'chomp if s/^START//..s/^END//; s/\S\K$/ /' input.txt #### use warnings; use strict; my @ORDER = qw/ TIME ALT TEMP COLOR STRENGTH /; my %ORDER = map {$ORDER[$_]=>$_+1} 0..$#ORDER; local $/ = "\nEND\n"; while (<>) { s/\A.*^START\n(.*)^END\n/$1/ms; next unless /\S/; my @lines = grep {/\S/} split /\n/; @lines = map { $$_[0] } sort { return $$a[1] <=> $$b[1] if $$a[1] && $$b[1]; return -1 if $$a[1]; return 1 if $$b[1]; return $$a[2] cmp $$b[2] } map { /^(\w+):/ ? [$_,$ORDER{$1},$1] : [$_,0,$_] } @lines; print join(" ", @lines), "\n"; }