#!/usr/bin/perl use strict; open IN, 'file'; open OUT, ">outfile"; my %HASH = (); my @RUNNING = (); my $INSIDE = ""; # keep track of where we are while(local $_ = ) { chomp; if(/^\s*$/) { # we have an empty line $HASH{$INSIDE} = @RUNNING if $INSIDE; @RUNNING = (); # empty running now that its copied $INSIDE = ""; # no longer inside anything next; # keep going } elsif(/^\s*(pos\s*\=\s*\d+)$/i) { # this should be the "header" $INSIDE = $1; next; } elsif($INSIDE) { push @RUNNING, $_; } } close IN; for(sort keys %HASH) { print OUT "$_\n", map { $_ .= "\n"; } @{$HASH{$_}}; } close OUT;