id col1 col2 col3 12 100 12 196 12 120 15 190 13 90 190 200 13 70 20 20 13 101 340 25 14 100 123 19 15 80 389 39 #### sub sort { my ($INPUT, $OUT) = @_; my %data; while (<$INPUT>) { next if (/^I|A|M/); chomp; my ($id,@cols) = split ('\t',$_); push @{$data{$id}}, \@cols; } my %hash; for my $key (keys %data){ for my $aref(@{$data{$key}}){ my $sum = sum(@{$aref}); print $sum,"\n"; push (@{$hash{$sum}{$key}}, @{$aref}); } } for my $sum (sort keys %hash){ for my $key({$hash{$sum}}){ for my $aref (@{$hash{$sum}{$key}}){ print "$key\t$sum\t"; } } } print $OUT Dumper(\%hash); }