#! perl -slw use strict; open IN, '+<', $ARGV[0] or die $!; my @splits; my $pos = 0; while( ) { $splits[ unpack 'n', substr( $_, 0, 2) ] .= pack( 'V', $pos ) . substr $_, 2, 4; $pos = tell IN; } @splits = grep $_, @splits; my $n; for my $split ( @splits ) { $split = join'', map{ substr $_, 0, 4 } sort{ my( $as, $at, $bs, $bt ) = ( unpack( 'VA4', $a ), unpack( 'VA4', $b ) ); $at cmp $bt || do{ seek IN, $as, 0; scalar } cmp do{ seek IN, $bs, 0; scalar } } unpack '(A8)*', $split; } for my $split ( @splits ) { printf do{ seek IN, $_, 0; scalar } for unpack 'V*', $split; }