Вот решение Perl
use strict;
use warnings 'all';
my %data;
while ( <DATA> ) {
my ( $f1, $f2, $seq, $n ) = m/[^-_\s]+/g;
$data{$f1}{$f2} += $fields[3];
}
for my $f1 ( keys %data ) {
for my $f2 ( keys %{ $data{$f1} } ) {
printf "%s-%s %d\n", $f1, $f2, $data{$f1}{$f2};
}
}
__DATA__
URS0000001D42-antisense_ATTTCGGTTGGGGAA 208
URS0000001D42-antisense_CATGCTCATAAGGAA 24
URS0000003804-lncRNA_GAGATCCTGGGTTTT 6
URS0000003CBA-antisense_CTGGGCTAGTGAACGCGGCGAAGT 14
URS0000003F61-antisense_AAAGTGCACTTGGACG 55
URS0000003F61-antisense_AAAGTGCACTTGGACGAA 4
выход
URS0000003CBA-antisense 14
URS0000001D42-antisense 232
URS0000003804-lncRNA 6
URS0000003F61-antisense 59
Вывод неупорядочен, поскольку хеши Perl не имеют собственного порядка. Немного сложнее сохранить выходные данные в том же порядке, что и входные данные, так как необходимо хранить массив для каждого хэша, который отслеживает порядок создания ключей
use strict;
use warnings 'all';
my ( %data, @keys );
while ( <DATA> ) {
my ( $f1, $f2, $seq, $n ) =/ [^-_\s]+/g;
push @keys, $f1 unless $data{$f1};
my $h2 = $data{$f1} //= {};
push @{ $h2->{''} }, $f2 unless $h2->{$f2};
$h2->{$f2} += $n;
}
for my $f1 ( @keys ) {
for my $f2 ( @{ $data{$f1}{''} } ) {
printf "%s-%s %d\n", $f1, $f2, $data{$f1}{$f2};
}
}
__DATA__
URS0000001D42-antisense_ATTTCGGTTGGGGAA 208
URS0000001D42-antisense_CATGCTCATAAGGAA 24
URS0000003804-lncRNA_GAGATCCTGGGTTTT 6
URS0000003CBA-antisense_CTGGGCTAGTGAACGCGGCGAAGT 14
URS0000003F61-antisense_AAAGTGCACTTGGACG 55
URS0000003F61-antisense_AAAGTGCACTTGGACGAA 4
выход
URS0000001D42-antisense 232
URS0000003804-lncRNA 6
URS0000003CBA-antisense 14
URS0000003F61-antisense 59