use strict; use warnings; my %HoA; while ( ) { next if m/^\D/; # ignore lines not beginning with a digit my ( $SampleID, $Time, $A_ObsConc, $C_ObsConc, $F_ObsConc ) = unpack("A9 A8 A15 A9 A*", $_); push @{ $HoA{A} } , [ $SampleID, $Time, $A_ObsConc ]; push @{ $HoA{C} } , [ $SampleID, $Time, $C_ObsConc ]; push @{ $HoA{F} } , [ $SampleID, $Time, $F_ObsConc ]; } for my $key ( sort keys %HoA ) { for my $aref ( @{ $HoA{$key} } ) { printf("%s %6s %9s %9s\n", $key, @$aref ); } } __DATA__ A C F SampleID Time ObsConc ObsConc ObsConc 5 24 2.27E+06 687.02 32521.94 5 168 1.92E+06 525.02 22198.44 5 12 2.94E+06 896.39 41331.61 5 -0.5 2.23E+06 942.34 40616.49 5 8 4.03E+06 1371.32 45863.69 6 24 1.02E+06 1057.89 46341.04 6 168 3.14E+06 4987.32 42166.08