my %min_data; for my $line (@lines) { my @columns = split ' ', $line; unless (exists $min_data{$columns[1]}) { $min_data{ $columns[1] } = {min=>$columns[0],lines=>[$line]}; } elsif ($columns[0] == $min_data{ $columns[1] }->{min}) { push @{ $min_data{ $columns[1] }->{lines} }, $line; } elsif ($columns[0] < $min_data{ $columns[1] }->{min}) { $min_data{ $columns[1] }->{lines} = [$line]; $min_data{ $columns[1] }->{min} = $columns[0]; } } for my $column_two (sort keys %min_data) { say for @{ $min_data{$column_two}->{lines} }; }