use Data::Dumper; ... my %keys; while() { push @secondpass, $_; $keys{$_}++ for /SATID (\d\d)/g; } print Dumper \%keys; my @keyorder = sort keys %keys; print Dumper \@keyorder; for (@secondpass) { my %items = reverse /(SATID (\d\d).{27})/g; print Dumper \%items; ; print join ' ', map { $items{$_} // ' ' x 35 } @keyorder; } ...