- Accueil
- » Forum
- » Terminal, scripts et ligne de commande
- » [Résolu] Awk, extraction d'un groupe de lignes suivant le résultat
Pages : 1
Discussion fermée
#1 Le 03/12/2012, à 19: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, à 21:03)
Hors ligne
#2 Le 03/12/2012, à 20: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, à 20: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, à 08:36)
Hors ligne
#4 Le 03/12/2012, à 20: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, à 20: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, à 20: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, à 21: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, à 22: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, à 22:17
- Doublecafe
Re : [Résolu] Awk, extraction d'un groupe de lignes suivant le résultat
Merci.
Hors ligne
#10 Le 04/12/2012, à 19: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, à 19: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 : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
Pages : 1
Discussion fermée