Skip to content

Instantly share code, notes, and snippets.

@JEEN
Last active April 14, 2016 15:23
Show Gist options
  • Save JEEN/172df68f5a5185f60b737a79aaedc693 to your computer and use it in GitHub Desktop.
Save JEEN/172df68f5a5185f60b737a79aaedc693 to your computer and use it in GitHub Desktop.
sum.pl
use strict;
use warnings;
use Text::CSV_XS;
use Path::Class::Rule;
use Data::Printer;
use Tie::IxHash;
die "Usage: perl sum.pl [directory]" unless -d $ARGV[0];
my $csv = Text::CSV_XS->new({ binary => 1 });
my $rule = Path::Class::Rule->new;
$rule->file->name(qr/\.txt$/);
my $iter = $rule->iter($ARGV[0]);
tie my %h, "Tie::IxHash";
my $idx = 0;
while(my $file = $iter->()) {
open my $fh, "<", $file;
$csv->getline($fh); # ignore header
my ($current_class, $current_order) = ("", "");
while(my $row = $csv->getline($fh)) {
my ($class, $order, $superfamily, $number) = @{ $row };
$number =~ s/[^\d]//g;
if ($class && !$order && !$superfamily) {
$current_class = $class;
$h{$class}{value} += $number;
}
if (!$class && $order && !$superfamily) {
push @{ $h{$current_class}{orders} }, $order if $idx == 0;;
$current_order = $order;
$h{$current_class}{$order}{value} += $number;
}
if (!$class && !$order && $superfamily) {
push @{ $h{$current_class}{$current_order}{superfamilies} }, $superfamily if $idx == 0;
$h{$current_class}{$current_order}{$superfamily}{value} += $number;
}
}
++$idx;
}
print join(",", "Class", "Order", "Superfamily", "# of bp covered")."\n";
while(my ($class, $r) = each %h) {
print join(",", $class, "", "", delete $r->{value})."\n";
my $orders = delete $r->{orders};
for my $order (@{ $orders }) {
my $r2 = $r->{$order};
print join(",", "", $order, "", delete $r2->{value})."\n";
my $superfamilies = delete $r2->{superfamilies};
for my $superfamily (@{ $superfamilies }) {
my $r3 = $r2->{$superfamily};
print join(",", "", "", $superfamily, delete $r3->{value})."\n";
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment