Bonjour à tous,
Je viens sur le forum C car j'ai un problème.
J'ai un fichier qui ressemble à cela :
Je souhaiterai trouver la séquence la plus petite que toutes ces séquences partagent entre elle (en gras dans mon exemple), et donc la seule séquence que j'aimerai récupérer est la seq 8 et seq14
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 >seq1 ACTTTCCACAACGATGGAAGATGATGA >seq2 ACTTTCCACAACGATGGAAGATGATGAA >seq3 ATTCCACAACGATGGAAGATGATGAA >seq4 CTTTCCACAACGATGGAAGATGATGAA >seq5 NTCCACAACGATGGAAGATGATGAAGA >seq6 TACTTTCCACAACGATGGAAGATGATGA >seq7 TACTTTCCACAACGATGGAAGATGATGAA >seq8 TCCACAACGATGGAAGATGATGA >seq9 AAAGAAGAAATTGAATAAATATATGTC >seq10 AAAGAAGAAATTGAATAAATATATGT >seq11 AAAGAAGAAATTGAATAAATATATGTCA >seq12 AAAGAAGAAATTGAATAAATATAT >seq13 AAAGAAGAAATTGAATAAATATATG >seq14 AAAGAAGAAATTGAATAAATATA
J'ai ce script perl qui fonctionne très bien sur un petit jeu de données:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 >seq8 TCCACAACGATGGAAGATGATGA >seq14 AAAGAAGAAATTGAATAAATATA
Mais malheureusement, j'ai un fichier avec plus de 2 millions de séquences, et cela fait 4 jours que mon script toune sur un serveur ( disques : 6To brut, mémoire vive : 16Go) ... je trouve que cela est très long, et je voulais savoir si vous pensiez qu'en langage C , cela pouvait aller plus vite ?
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
56
57
58
59
60
61
62 #!/usr/bin/perl # Input file: a fasta file # Output file: a unique fasta file # Command line: perl test.pl infile.fasta use strict; use warnings; use List::MoreUtils qw(uniq); #read the file into a hash my %hash; my $title; my $infile=shift or die "give me a infile\n"; open (IN,"$infile"); while (<IN>){ $_=~s/\n//; $_=~s/\r//; if ($_=~/>/){ $title=$_; $title=~s/>//; } else{ $hash{$_}=$title; } } print "hash ok \n"; close IN; #remove the abundant sequences my @sort_all_seq = sort {length($a) <=> length($b)} keys (%hash); print "sort ok \n"; my @uniqueseq; my $find=0; foreach my $seqs (@sort_all_seq){ $find=0; my $seq=uc($seqs); #uppercase (retourne la chaine en majuscule) foreach (@uniqueseq){ if ($_=~/$seq/){ # si ma sequence contient $_=$seq; #remplace avec la plus petite sequence $find=1; last; } if ($seq=~/$_/){ $find=1; # ajout d'un last ici ? } } if ($find==0){ push @uniqueseq,$seq; } } print "writing ....\n"; my @final = uniq @uniqueseq; #outout the final result open (OUT,">tmp.fa"); foreach (@final){ print OUT ">$hash{$_}\n$_\n"; } close OUT;
Pb : je ne sais pas coder en C !
Partager