use strict; my %dataset; while (<>) { # $_ => Id, Loc, Value, Etime my ($id, $loc, $value, $etime) = split(/,/, $_); $dataset{$id}{$etime} = { "Value" => $value, "Loc" => $loc, }; } foreach my $id (sort keys %dataset) { foreach my $etime ( sort { my ($loc_a, $head_a) = $dataset{$id}{$a}{Loc} =~ /S(\d+)H(\d)/; my ($loc_b, $head_b) = $dataset{$id}{$b}{Loc} =~ /S(\d+)H(\d)/; if (($head_a <=> $head_b) == 0) { $loc_a <=> $loc_b; } else { $head_a <=> $head_b; } } keys %{$dataset{$id}} ) { my $loc = $dataset{$id}{$etime}{Loc}; my $value = $dataset{$id}{$etime}{Value}; printf(STDOUT "%2s, %6s, %.1f, %i\n", $id, $loc, $value, $etime); } }