Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 03/12/2012, à 18:57

Doublecafe

[Résolu] Awk, extraction d'un groupe de lignes suivant le résultat

Bonjour,

J'ai pour projet la création d'un petit script me permettant le téléchargement de séquences génétiques précises depuis une base de données.
Le fichier "brut" une fois téléchargé doit être filtré pour ne retenir qu'une seule catégorie de séquence (pour info: les rRNA).
Voici un extrait du fichier "brut" (n'oubliez pas de scroller vers la droite, la partie "interessante" se trouve à ce niveau là smile ) :

>ENSAMET00000025279 mt_genbank_import:Mt_tRNA scaffold:ailMel1:MT:16669:16740:1 gene:ENSAMEG00000023456 gene_biotype:Mt_tRNA transcript_biotype:Mt_tRNA
GTCTTTGTAGTATATTAATTACTTTGGTCTTGTAAACCAAAAACGGAGATTCCTCTACTT
CTCCCTAAGACT
>ENSAMET00000025280 mt_genbank_import:Mt_tRNA scaffold:ailMel1:MT:16740:16805:1 gene:ENSAMEG00000023457 gene_biotype:Mt_tRNA transcript_biotype:Mt_tRNA
TCAAGGAAGGAGCAACAACCCCACTACCAGCACCCAAAGCTGGTGTTCTACTTAAACTAT
CCCCTG
>ENSAMET00000024058 ncrna:rRNA scaffold:ailMel1:GL192670.1:1084758:1084883:1 gene:ENSAMEG00000022235 gene_biotype:rRNA transcript_biotype:rRNA
TCAGAGAGTGTTACAGACCTCCTCCCTCAAACTGTGATCTTGTCAGATCTCATAAGCCAA
ACAAAGTTGGGGCTGGGTGTGTACTTGGATAAGAGGACTATTGAGGAAAAATTAGCATTT
TCTGGT
>ENSAMET00000023247 ncrna:rRNA scaffold:ailMel1:GL193102.1:202330:202448:1 gene:ENSAMEG00000021424 gene_biotype:rRNA transcript_biotype:rRNA
GTCTACGGCCATACCACCCTGAAAGCGCCTGATCTTGTCTCATCTCAGAAGCTAAGCAGG
GTCGGGCCTGGTTAGTACTTGGATGGGAGTCCTTCTTTACATCCAGTCAACAAAAGAAC
>ENSAMET00000022436 ncrna:rRNA scaffold:ailMel1:GL194145.1:234859:234983:1 gene:ENSAMEG00000020613 gene_biotype:rRNA transcript_biotype:rRNA
GTCTACGGCCATACCACCCTGAATGCTCCCGATCTCGTCTGATCTCGGAAGCTAAGCAGG
GTTGGACCTGGTTAGTACTTGGATGGGAAGTGAGGGCTCTCAAAAGCCTTTTGGTAGTGT
ATCCA
>ENSAMET00000022443 ncrna:rRNA scaffold:ailMel1:GL192363.1:4052156:4052274:1 gene:ENSAMEG00000020620 gene_biotype:rRNA transcript_biotype:rRNA
GTTTATGGCCATATCACCCTGAAGGAGCCCGATCTCATCTGATCTGGGAAGTTAAGCAGG
GTCAGGCCTGGTTAGTACGTAGATGGGATTCCGCCTGGGAATACTGGCTGCTGTGGGCT

J'aimerais sélectionner dans cet extrait toutes les séquences "rRNA", elle se situent après la ligne contenant "transcript_biotype:rRNA" (ligne incluse car elle possède les identifiants du gène).
J'ai pensé  à l'utilisation de la commande: grep -A "transcript_biotype:rRNA", cependant le nombre de ligne après cette chaîne de caractères est aléatoire .

En résumé voilà pourquoi j'ai besoin de vous :

J'aimerais sélectionner toutes les parties entre la ligne possédant la chaîne de caractères "transcript_biotype:rRNA" (ligne incluse) et le ">ENSAMET" suivant (exclu car c'est l'en-tête de la séquence suivante).

Merci par avance pour vos propositions.

edit modo : message restauré.
Merci de respecter les contributeurs de ce forum, ce n'est pas une hotline et les questions doivent être préservées pour le bien commun.
Pour toute remarque → moderateurs [at] ubuntu-fr [point] org

Dernière modification par nesthib (Le 06/12/2012, à 20:03)

Hors ligne

#2 Le 03/12/2012, à 19:07

aduxas

Re : [Résolu] Awk, extraction d'un groupe de lignes suivant le résultat

sed -n '/transcript_biotype:rRNA/,/ENSAMET/p' fichier | sed '/ENSAMET/d'

Hors ligne

#3 Le 03/12/2012, à 19:14

pingouinux

Re : [Résolu] Awk, extraction d'un groupe de lignes suivant le résultat

Bonsoir,
Autre solution, avec awk :

awk '/^>ENSAMET/{$0~/transcript_biotype:rRNA$/ && ok=1 || ok=0} {if(ok) print}' fichier

Corrigé : La commande ci-dessus est erronée, à cause de la précédence des opérateurs  (voir les messages #5 et #6)
Voici la bonne :

awk '/^>ENSAMET/{$0~/transcript_biotype:rRNA$/ && (ok=1) || (ok=0)} {if(ok) print}' fichier

Celle-ci est correcte également (identique à celle de #6) :

awk '/^>ENSAMET/{if($0~/transcript_biotype:rRNA$/) ok=1; else ok=0} {if(ok) print}' fichier

Dernière modification par pingouinux (Le 04/12/2012, à 07:36)

Hors ligne

#4 Le 03/12/2012, à 19:28

pingouinux

Re : [Résolu] Awk, extraction d'un groupe de lignes suivant le résultat

@aduxas #2 :
Ta commande ne donne pas tout-à-fait le résultat souhaité. Si tu as 2 séquences consécutives à conserver, la seconde est omise. Doublecafe voulait aussi conserver la première ligne des bonnes séquences.

Hors ligne

#5 Le 03/12/2012, à 19:31

Doublecafe

Re : [Résolu] Awk, extraction d'un groupe de lignes suivant le résultat

Merci beaucoup pour vos réponses ,

@aduxas: Ta commande supprime malheureusement les en-tête.

@pingouinux: Ta commande fonctionne à merveille, le seul bémol ce sont les résultats qui ne s'arrêtent pas à la dernière séquence de rRNA trouvée mais continuent jusqu'à la fin du fichier.

Je vous link le fichier (texte compréssé en .gz) si vous voulez voir à quoi ça ressemble en entier (génotype du Panda d'où provient l'extrait de mon post initial): Ailuropoda_melanoleuca_ncRNA

Hors ligne

#6 Le 03/12/2012, à 19:44

pingouinux

Re : [Résolu] Awk, extraction d'un groupe de lignes suivant le résultat

@Doublecafe :
C'est exact, je n'avais pas testé ce cas-là, désolé. Voici la version corrigée :

awk '/^>ENSAMET/{if($0~/transcript_biotype:rRNA$/) ok=1; else ok=0} {if(ok) print}' fichier

Hors ligne

#7 Le 03/12/2012, à 20:27

Doublecafe

Re : [Résolu] Awk, extraction d'un groupe de lignes suivant le résultat

@pingouinux:
Merci beaucoup, c'est exactement ce que je voulais. C'est vrai que l'extrait que j'ai affiché portait à confusion.
J'ai un dernier service à te demander: pourrais-tu me commenter ta commande si ce n'est pas trop demander? Ça me permettrait de la comprendre et ainsi de pouvoir l'utiliser ultérieurement.

Hors ligne

#8 Le 03/12/2012, à 21:14

pingouinux

Re : [Résolu] Awk, extraction d'un groupe de lignes suivant le résultat

Voici la logique des opérations :

Boucle sur toutes les lignes
     Si la ligne commence par >ENSAMET
           Si elle finit aussi par transcript_biotype:rRNA
                ok=1
           Sinon
                ok=0
     Si ok=1
            On imprime la ligne

Hors ligne

#9 Le 03/12/2012, à 21:17

Doublecafe

Re : [Résolu] Awk, extraction d'un groupe de lignes suivant le résultat

Merci.

Hors ligne

#10 Le 04/12/2012, à 18:57

Totor

Re : [Résolu] Awk, extraction d'un groupe de lignes suivant le résultat

bonsoir,
une autre approche :

awk -v RS=">" -v ORS="" '/transcript_biotype:rRNA/ {print ">"$0}' test.txt

-- Lucid Lynx --

Hors ligne

#11 Le 05/12/2012, à 18:25

nesthib

Re : [Résolu] Awk, extraction d'un groupe de lignes suivant le résultat

Je rejoins Totor sur cette méthode, et si jamais tu veux en profiter pour joindre ta séquence ADN en une seule suite de caractères :

awk -v RS=">" -v ORS="\n" -v FS='\n' -v OFS="" '/transcript_biotype:rRNA/ {$1=$1" ";print ">"$0}' fichier

Et pour avoir un format FASTA :

awk -v RS=">" -v ORS="\n" -v FS='\n' -v OFS="" '/transcript_biotype:rRNA/ {$1=$1"\n";print ">"$0}' fichier

GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne