kawaccino | Bonsoir à tous!
je viens solliciter vos lumières au sujet d'un script Perl visant la manipulation de fichiers. Alors voilà ce que j'ai:
- deux fichiers comportant des lignes allant deux par deux, organisés comme ceci (même organisation pour les deux:
>1 count:272019
TACCTGGTTGATCCTGCCAG
>2 count:48613
TTTGGATTGAAGGGAGCTCTA
>3 count:15422
TTTGGATTGAAGGGAGCTCT
>4 count:9818
TTGGACTGAAGGGAGCT
>5 count:8783
TTGGACTGAAGGGAGCTCCCT
- ces deux fichiers ne sont pas triés dans le même ordre, mais il devraient avoir des séquences (la deuxième ligne de chaque bloc de deux lignes qui se retrouvent dans les deux fichiers
Passons maintenant à ce que j'aimerais faire:
- trier ces fichiers afin que les séquences qu'ils contiennent soient dans le même ordre
- éditer la ligne de nom (la première ligne de chaque bloc de deux lignes) afin de ne garder que la valeur située après "count:" (NOTE: pour une même séquence cette valeur est différente entre le fichier 1 et le fichier 2). Pour les séquences n'apparaissant que dans l'un des fichiers, il faudrait que dans celui où elles n'apparaissent pas leur valeur de count soit égale à zéro.
Ce que j'ai fait jusque là: j'ai réussi à trier toutes mes séquences de façon à ce qu'elles soient dans le même ordre dans mes deux fichiers (j'ai créé deux nouveaux fichiers, afin de ne pas altérer mes fichiers d'origine). Mon code est comme ceci:
Code :
- use warnings;
- use strict;
- my $fast1="C:/Users/Moi/fichier1.fasta";
- open (my $IN1, "<", $fast1) or die "Impossible d'ouvrir le fichier $fast1 $!";
- my $fast2="C:/Users/Moi/fichier2.fasta";
- open (my $IN2, "<", $fast2) or die "Impossible d'ouvrir le fichier $fast2 $!";
- my $trie1="C:/Users/Moi/fichier1bis.fasta";
- open (my $OUT1, ">", $trie1) or die "Impossible d'ouvrir le fichier $trie1 $!";
- my $trie2="C:/Users/Moi/fichier2bis.fasta";
- open (my $OUT2, ">", $trie2) or die "Impossible d'ouvrir le fichier $trie2 $!";
- my %results;
- #my @tab;
- my ($name, $line);
- while($name = <$IN1> )
- {
- $line=<$IN1>;
- chomp $name;
- chomp $line;
- #@tab = split (/:/, $name);
- #$count=$tab[1];
- $results{$line}=1;
- }
- while($name = <$IN2> )
- {
- $line=<$IN2>;
- chomp $name;
- chomp $line;
- #@tab = split (/:/, $name);
- #$count=$tab[1];
- if (exists $results{$line})
- {
- $results{$line}++;
- }
- }
- foreach $line (keys %results)
- {
- if ($results{$line} == 1)
- {
- print $OUT1 "$line\n";
- }
- if ($results{$line}==2)
- {
- print $OUT1 "$line\n";
- print $OUT2 "$line\n";
- }
- else
- {
- print $OUT2 "$line\n";
- }
- }
- close ($IN1);
- close ($IN2);
- close ($OUT1);
- close ($OUT2);
- print "Programme termine";
- <STDIN>
|
Bon alors, comme je l'ai dit, ce code semble marcher. Cependant, mon problème est: je ne sais pas comment faire pour garder la valeur de count et qu'elle reste bien associée à la ligne à laquelle elle correspondait dans le fichier d'origine. Au début je voulais faire un $results{$count}=1, etc (comme pour la séquence), mais le problème est que je n'ai pas le même count dans le deux fichiers pour une même séquence, du coup, je suis perdu... Comme vous pouvez le voir par les lignes commentées que j'ai laissées dans mon code, j'avais aussi une idée d'y stocker dans un tableau, mais en fait, je ne vois pas comment spécifier que cette valeur doit rester associée à la séquence de la ligne suivante...
Je dois bien avouer être une énorme bille en hash et encore plus en hash de hash que je ne comprend absolument pas, bien que je lise cours et exemples, et donc un petit coup de main serait le bienvenu... ---------------
Je n'ai pas une case en moins, je commence juste à compter à partir de zéro
|