use strict; use warnings; use Data::Table; use List::Util qw/sum/; my $data = [ map { chomp; [ split /\s+/ ] } ]; # read data into array of arrays my $header = [ map { "col$_" } 0..@{$data->[0]}-1 ]; # create some headers for the data my $t = new Data::Table( $data, $header, 0 ); my $summary = $t->group( [ "col0" ], # base column [ "col2", "col2", "col3", "col3" ], # fields [ sub{scalar @_}, sub{sum @_}, sub{scalar @_}, sub{sum @_}, ], # aggregation functions [ "Count2", "Sum2", "Count3", "Sum3" ], # names of result columns 0 ); # do not display other columns print $summary->tsv; # print results in tabular form __DATA__ U1 ID1 100 280 U1 ID1 137 250 U2 ID2 150 375 U1 ID2 100 100 U3 ID1 100 600 U9 ID3 137 200