remanier un fichier avec des regex
Bonjour à tous,
J'avais déjà posté concernant mon problème mais le bug du forum l'a effacé... du coup je retente ma chance ! :D
J'ai en entrée un fichier fasta se présentant sous la forme:
Code:
1 2 3 4 5 6 7 8 9 10
| >segment749_1
SSGAKRSSRGSRDFSWAAYRFHATSANRNAVEPTSSEVWIWV*RH*ESNPSTIPAIAS
RSASTVEISAARDCMSTSSSRLAAPNPLPTPGPT*SMWEGRTGVVSSIAVAKRFASFA
TGASRRQTLGSQPSFVRLVSSTVSDSRLMTSAALSARASAQDRRTTAGTRRRPWWGSF
DSLPRAPVRSR*RSPRSSKRGTRAS*RRWAW*CCGQCTSLGSRWRRLARPSAWIARSG
PTCCTTTATTSGRL*STLRGVPKRTTPWLHISWELLHSEPSEAYAMARATSGCIC*WS
YIHLSPCSAQTYT**ARSSVWPQTCGARARNRSHPGPVAYRRVS*RSEGCCAGRWRR*
PR*RRSRWAQLLARWRRDRRSRGARSSGQTGGRRAR*GCSRTSSGTGARHRCASRPDR
PQSRRGTRSTRCSERAT*RPRWRNAPTRSPPTPSRCGRHGAASRGTTRGALLHGVPF*
GATAPRCTPVRTSGATCSR*PRSHSPSRSRR* |
on y voit notamment plein d'étoiles partout que je souhaite enlever... chaque séquence entre les étoiles correspond à un cadre de lecture, cette séquence pouvant se situer sur 2 lignes ou plus ou alors sur 3 lettres (en bleu)... il y a aussi des cadres qui ne donnent rien d'où le ** (en vert)...
J'ai écrit un script en 2 temps et j'aimerais savoir si vous auriez des idées pour transformer les 2 parties en 1...
1ère étape:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
foreach my $line (@file){
if ($line =~ /\>/)
{$line =~ s/\>/\n\>/g;} # ajoute un retour à la ligne sinon on a un problème par la suite
else
{
$line =~ s/\n//g; #remplace le retour à la ligne par rien car on a des séquences sur plusieurs lignes
$line =~ s/\*\*/\*/g; # remplace les ** par une seule car on a pas de séquence
$line =~ s/\*/\n/g; # remplace toutes les * par un retour à la ligne qui permet de visualiser chaque séquence
}
print $out $line;
} |
pour obtenir:
Code:
1 2 3 4 5 6 7 8 9 10 11
| >segment749_1
SSGAKRSSRGSRDFSWAAYRFHATSANRNAVEPTSSEVWIWV
RH
ESNPSTIPAIASRSASTVEISAARDCMSTSSSRLAAPNPLPTPGPT
SMWEGRTGVVSSIAVAKRFASFATGASRRQTLGSQPSFVRLVSSTVSDSRLMTSAALSARASAQDRRTTAGTRRRPWWGSFDSLPRAPVRSR
RSPRSSKRGTRAS
RRWAW
CCGQCTSLGSRWRRLARPSAWIARSGPTCCTTTATTSGRL
STLRGVPKRTTPWLHISWELLHSEPSEAYAMARATSGCIC
WSYIHLSPCSAQTYT
ARSSVWPQTCGARARNRSHPGPVAYRRVS |
2ème étape
avec un print foreach line..
J'obtiens:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| >segment749_1 _ORF_1
SSGAKRSSRGSRDFSWAAYRFHATSANRNAVEPTSSEVWIWV
>segment749_1 _ORF_2
RH
>segment749_1 _ORF_3
ESNPSTIPAIASRSASTVEISAARDCMSTSSSRLAAPNPLPTPGPT
>segment749_1 _ORF_4
SMWEGRTGVVSSIAVAKRFASFATGASRRQTLGSQPSFVRLVSSTVSDSRLMTSAALSARASAQDRRTTAGTRRRPWWGSFDSLPRAPVRSR
>segment749_1 _ORF_5RSPRSSKRGTRAS
>segment749_1 _ORF_6
RRWAW
>segment749_1 _ORF_7
CCGQCTSLGSRWRRLARPSAWIARSGPTCCTTTATTSGRL
>segment749_1 _ORF_8
STLRGVPKRTTPWLHISWELLHSEPSEAYAMARATSGCIC
>segment749_1 _ORF_9
WSYIHLSPCSAQTYT
>segment749_1 _ORF_10
ARSSVWPQTCGARARNRSHPGPVAYRRVS
>segment749_1 _ORF_11
RSEGCCAGRWRR |
Donc voilà !! Merci d'avance pour vos conseils