Extraire une chaîne d'un fichier à partir des chaînes autour [Résolu/Fermé]

Signaler
-
Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
-
Bonjour,

J'ai un petit souci d'extraction de chaîne de caractères dans un fichier contenant des séquences nucléiques. Mon fichier (format FASTA) se présente de la façon suivante :

>scaffold14
TGGGTC[...]
[...]
[...]CCACCC
>scaffold7
ATG...
...TAG
>scaffold8
...

etc.

Autrement dit, une ligne indiquant le numéro du scaffold, puis des lignes ne contenant que les caractères A, T, C, G et N et qui font toutes 60 caractères (sauf éventuellement la dernière), puis un nouveau scaffold.

Ce que j'aimerais extraire, ce sont les lignes de séquences d'un scaffold particulier, et uniquement celui-ci. Autrement dit, tous les caractères entre la ligne '>scaffold475' et la prochaine ligne '>scaffold[0-9]+'. Les lignes de commande que j'ai utilisées, notamment avec sed, ont mis plusieurs retours à la ligne à la fin du fichier, comme si plusieurs scaffolds avaient été embarqués.
(La commande :
sed -n '/scaffold475/,/scaffold/{//d;p}' monfichier.fa > masortie.fa
)

Je me doute que ce que je demande est assez basique (surtout que si le fichier était plus petit je pourrais faire un copier-coller sans souci ^^' ), mais c'est un peu frustrant de ramer là-dessus...

Merci de votre lecture

1 réponse

Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 283
Salut,

C'est bizarre cette histoire de retours à la ligne ;-\
Normalement ta syntaxe sed devrait bien faire le boulot comme tu le décris, la preuve :
$ cat plop 
>scaffold14
TGGGTC[...]
[...]
[...]CCACCC
>scaffold7
ATG...
...TAG
>scaffold8
AATG...
...TAGG
AACCGG
<scaffold10
TAGG
AACC
$ sed -n '/^>scaffold7/,/^>scaffold/{//d;p}' plop
ATG...
...TAG
$


Quel est le format de ton fichier d'entrée ? (Dos ou Unix)
Le fichier d'entrée est en format Unix.

Ou alors mon fichier initial contient des retours à la ligne mal placés au sein des scaffolds, ce qui est normalement bien peu probable mais expliquerait mon problème, tout en rendant ma question caduque ! ^^
Solution trouvée : il y a des scaffolds numérotés 4751 ou autres qui ont été rajoutés à la suite, et j'ai pu le voir une fois le fichier d'entrée complètement chargé dans mon éditeur de texte...
Ce qui est étrange c'est que les chiffres supplémentaires (comme le 1 de 4751) n'ont pas été ajoutés au fichier de sortie.
Mon problème est donc résolu, mais si quelqu'un saurait répondre à ces deux questions :
  • Comment préciser que l'on souhaite le scaffold numéro bidule (ici 475) et pas les bidule-truc (comme 4751) ?
  • Pourquoi les chiffres supplémentaires ne se sont pas copiés dans le fichier de sortie alors qu'ils sont finalement entre les deux chaînes de délimitation ?


Et merci de ton coup de main zipe31 ! ;-)
Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 283 > Pat@
Comment préciser que l'on souhaite le scaffold numéro bidule (ici 475) et pas les bidule-truc (comme 4751) ?
Il faut le préciser dans le motif avec
\>
ou
\b
:
sed -n '/^>scaffold475\>/,/^>scaffold/{//d;p}' fichier
ou
sed -n '/^>scaffold475\b/,/^>scaffold/{//d;p}' fichier


Pourquoi les chiffres supplémentaires ne se sont pas copiés dans le fichier de sortie alors qu'ils sont finalement entre les deux chaînes de délimitation ?
Bonne question, et je n'ai pas la réponse ;-\
J'ai oublié de répondre ce week-end, mais merci pour les réponses apportées !
Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 283 > Pat@
Et moi j'avais omis qu'on pouvait aussi faire comme ça (si on est en fin de ligne) :
sed -n '/^>scaffold475$/