my $header = <>; chomp($header); my @field_names = split /\t/, $header; my %grouped_by_num2; while (<>) { chomp; my %rec; @rec{ @field_names } = split /\t/; push @{ $grouped_by_num2{$rec{SECOND_NUMBER}} }, \%rec; } use Data::Dumper; print(Dumper(\%grouped_by_num2));