J'ai un fichier de ce type (identifiant du gène, taille, classe)
J'ai 4 classes (D,S,L,T)gene260 10 classeD
gene260 15 classeS
gene260 30 classeS
gene260 3 classeL
gene260 7 classeD
gene75 8 classeS
gene75 2 classeS
gene75 5 classeS
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)Voilà le début de mon code, mais j'ai des souci pour prendre en compte "un gène donnée d'une classe"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,
};
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"; } }
Partager