J'ai un fichier de ce type (identifiant du gène, taille, classe)
gene260 10 classeD
gene260 15 classeS
gene260 30 classeS
gene260 3 classeL
gene260 7 classeD
gene75 8 classeS
gene75 2 classeS
gene75 5 classeS
J'ai 4 classes (D,S,L,T)
Je souhaiterai obtenir pour chaque classe d'un gène donnée, la taille. Pour la classe all (classe que je crée) je souhaiterai la taille totale toute classe confondu. soit,
gene260 classeD 17(10+7)
gene260 classeS 45(15+30)
gene260 classeL 3
gene260 classeT 0
gene260 all 65(10+15+30+3+7)
gene75 classeD 0
gene75 classeS 15(8+2+5)
gene75 classeL 0
gene75 classeT 0
gene75 all 15(0+8+2+5)
Je suis parti sur un hash de hash du genre
$hash{ gene } = {
classeD => 10,7,
classeS => 15,30,
classeL => 3,
classeT => 0,
all => 10,15,30,3,7,
};
Voilà le début de mon code, mais j'ai des souci pour prendre en compte "un gène donnée d'une classe"
Mon code suivant m'affiche
gene260 classeD 17
gene75 classeS 15



Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 
#!/usr/bin/perl -w
use strict;
use warnings;
use Bio::SeqIO;
use List::Util qw(sum);
 
 
my %hash=();
my %new=();
my @tab;
my @classe2 ;
my $gene;
 
 
open FILE, "corrige" or die $!;
while(my $ligne = <FILE>){
	chomp $ligne;
	if($ligne  =~ /^#(gene.*)\t([0-9]*)$/){
		$hash{$1}=$1;
		@tab = (); #déclarer un tableau vide tableau contient tous les ensg...
                @classe2 = ();
	}
 	elsif($ligne  =~ /(.*)\t([0-9]*)\t(.*)$/){
		my $gene=$1;
		my $taille=$2;
		my $classe=$3;
		if (exists $hash{$gene}){   
			if($classe eq "classeD" ){				
				push (@tab,$taille);
 
				#somme	de la colonne							
				my $somme = sum(@tab);
				print "somme : $somme\n";
				$new{$gene} = {classeD => $somme};
			}
			if($classe eq "classeS" ){
				print "$ligne\n";
				push (@classe2,$taille);
				print "sss@classe2\n";
 
				#somme	de la colonne							
				my $somme = sum(@classe2);
				print "somme : $somme\n";	
				$new{$gene} = {classeS => $somme};
 
			}
		}
	}
}
foreach my $c (keys %new){
	foreach (keys %{$new{$c}}){
		print "$c\t$_\t$new{$c}{$_}\n";
	}
}