Besoin d'aide pour trier des lignes dans un fichier
Résolu
joeoj
-
-
-
Bonjour,
je suis étudiant en biologie, et dans le cadre de mes recherches j'ai besoin de traiter l'ensemble des protéines d'un organisme pour savoir si elle sont sécrétées. J'ai réussi a effectué cette manip à l'aide du standalone de signalP, mais je me retrouve avec un fichier de 30000 lignes sous la forme :
# SignalP-4.0 euk predictions
# name Cmax pos Ymax pos Smax pos Smean D ? Dmaxcut Networks-used
IPI:IPI00000001.2 0.143 42 0.123 42 0.142 39 0.100 0.110 N 0.450 SignalP-noTM
IPI:IPI00000005.1 0.120 19 0.120 19 0.137 4 0.118 0.119 N 0.450 SignalP-noTM
IPI:IPI00000006.1 0.120 19 0.120 19 0.137 4 0.118 0.119 N 0.450 SignalP-noTM
IPI:IPI00000012.4 0.549 30 0.424 30 0.672 5 0.463 0.439 N 0.500 SignalP-TM
IPI:IPI00000013.1 0.658 18 0.768 18 0.931 15 0.891 0.834 Y 0.450 SignalP-noTM
IPI:IPI00000015.2 0.112 47 0.103 59 0.113 13 0.095 0.099 N 0.450 SignalP-noTM
IPI:IPI00000017.1 0.112 22 0.120 4 0.140 34 0.125 0.123 N 0.450 SignalP-noTM
IPI:IPI00000020.1 0.113 23 0.135 12 0.209 4 0.163 0.150 N 0.450 SignalP-noTM
IPI:IPI00000021.5 0.113 23 0.183 10 0.359 2 0.300 0.246 N 0.450 SignalP-noTM
IPI:IPI00000023.4 0.389 41 0.532 41 0.903 38 0.534 0.533 Y 0.450 SignalP-noTM
je voudrais maintenant réussir à récupérer toute les lignes ou la réponse est positive (Y sous la colonne "?") et les envoyer dans un nouveau fichier appelé sortie.
Je viens juste de commencer à m'atteler à l'apprentissage de Perl car je vais en avoir besion régulierement, cependant j'ai besoin de ce résultat rapidement et c'est au dessus de mes capacité pour l'instant ...
Si il y a quelques âmes charitable seraient disposées à m'aider, je serais très reconnaissant ;)
Jo
je suis étudiant en biologie, et dans le cadre de mes recherches j'ai besoin de traiter l'ensemble des protéines d'un organisme pour savoir si elle sont sécrétées. J'ai réussi a effectué cette manip à l'aide du standalone de signalP, mais je me retrouve avec un fichier de 30000 lignes sous la forme :
# SignalP-4.0 euk predictions
# name Cmax pos Ymax pos Smax pos Smean D ? Dmaxcut Networks-used
IPI:IPI00000001.2 0.143 42 0.123 42 0.142 39 0.100 0.110 N 0.450 SignalP-noTM
IPI:IPI00000005.1 0.120 19 0.120 19 0.137 4 0.118 0.119 N 0.450 SignalP-noTM
IPI:IPI00000006.1 0.120 19 0.120 19 0.137 4 0.118 0.119 N 0.450 SignalP-noTM
IPI:IPI00000012.4 0.549 30 0.424 30 0.672 5 0.463 0.439 N 0.500 SignalP-TM
IPI:IPI00000013.1 0.658 18 0.768 18 0.931 15 0.891 0.834 Y 0.450 SignalP-noTM
IPI:IPI00000015.2 0.112 47 0.103 59 0.113 13 0.095 0.099 N 0.450 SignalP-noTM
IPI:IPI00000017.1 0.112 22 0.120 4 0.140 34 0.125 0.123 N 0.450 SignalP-noTM
IPI:IPI00000020.1 0.113 23 0.135 12 0.209 4 0.163 0.150 N 0.450 SignalP-noTM
IPI:IPI00000021.5 0.113 23 0.183 10 0.359 2 0.300 0.246 N 0.450 SignalP-noTM
IPI:IPI00000023.4 0.389 41 0.532 41 0.903 38 0.534 0.533 Y 0.450 SignalP-noTM
je voudrais maintenant réussir à récupérer toute les lignes ou la réponse est positive (Y sous la colonne "?") et les envoyer dans un nouveau fichier appelé sortie.
Je viens juste de commencer à m'atteler à l'apprentissage de Perl car je vais en avoir besion régulierement, cependant j'ai besoin de ce résultat rapidement et c'est au dessus de mes capacité pour l'instant ...
Si il y a quelques âmes charitable seraient disposées à m'aider, je serais très reconnaissant ;)
Jo
A voir également:
- Besoin d'aide pour trier des lignes dans un fichier
- Fichier bin - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Trier un tableau excel - Guide
- Fichier rar - Guide
7 réponses
Salut,
$ cat fich # SignalP-4.0 euk predictions # name Cmax pos Ymax pos Smax pos Smean D ? Dmaxcut Networks-used IPI:IPI00000001.2 0.143 42 0.123 42 0.142 39 0.100 0.110 N 0.450 SignalP-noTM IPI:IPI00000005.1 0.120 19 0.120 19 0.137 4 0.118 0.119 N 0.450 SignalP-noTM IPI:IPI00000006.1 0.120 19 0.120 19 0.137 4 0.118 0.119 N 0.450 SignalP-noTM IPI:IPI00000012.4 0.549 30 0.424 30 0.672 5 0.463 0.439 N 0.500 SignalP-TM IPI:IPI00000013.1 0.658 18 0.768 18 0.931 15 0.891 0.834 Y 0.450 SignalP-noTM IPI:IPI00000015.2 0.112 47 0.103 59 0.113 13 0.095 0.099 N 0.450 SignalP-noTM IPI:IPI00000017.1 0.112 22 0.120 4 0.140 34 0.125 0.123 N 0.450 SignalP-noTM IPI:IPI00000020.1 0.113 23 0.135 12 0.209 4 0.163 0.150 N 0.450 SignalP-noTM IPI:IPI00000021.5 0.113 23 0.183 10 0.359 2 0.300 0.246 N 0.450 SignalP-noTM IPI:IPI00000023.4 0.389 41 0.532 41 0.903 38 0.534 0.533 Y 0.450 SignalP-noTM $ awk '/^IPI/ && $10 ~ /Y/ { print $0 }' fich IPI:IPI00000013.1 0.658 18 0.768 18 0.931 15 0.891 0.834 Y 0.450 SignalP-noTM IPI:IPI00000023.4 0.389 41 0.532 41 0.903 38 0.534 0.533 Y 0.450 SignalP-noTM $
Bonjour joeoj,
Quand je lis que tu t'es lancé dans Perl parce que tu vas avoir à l'utiliser régulièrement, ça me fait frémir.
Est-ce que tu t'es renseigné sur Perl avant de te lancer dans son apprentissage ? C'est un langage en perte de vitesse, il n'attire plus comme avant, pour deux raisons essentielles: il a des défauts (pas orienté objet de façon native, difficile à apprendre, illisible, hermétique) et Python qui est un langage de script comme lui l'a remplacé comme langage choisi par ceux qui veulent atteindre rapidement la capacité d'écrire de bon programmes dans un langage puissant.
Je te conseille fortement de t'intéresser un minimum à Python, c'est un langage dans lequel tu auras beaucoup plus et plus rapidement de productivité, avec un apprentissage de départ beaucoup plus aisé. Pour quelqu'un qui veut obtenir rapidement des résultats sans se casser les dents sur des complications inutiles, Python est parfait. C'est valable par rapport à Perl aussi bien que par rapport à Java et C++
Quand je lis que tu t'es lancé dans Perl parce que tu vas avoir à l'utiliser régulièrement, ça me fait frémir.
Est-ce que tu t'es renseigné sur Perl avant de te lancer dans son apprentissage ? C'est un langage en perte de vitesse, il n'attire plus comme avant, pour deux raisons essentielles: il a des défauts (pas orienté objet de façon native, difficile à apprendre, illisible, hermétique) et Python qui est un langage de script comme lui l'a remplacé comme langage choisi par ceux qui veulent atteindre rapidement la capacité d'écrire de bon programmes dans un langage puissant.
Je te conseille fortement de t'intéresser un minimum à Python, c'est un langage dans lequel tu auras beaucoup plus et plus rapidement de productivité, avec un apprentissage de départ beaucoup plus aisé. Pour quelqu'un qui veut obtenir rapidement des résultats sans se casser les dents sur des complications inutiles, Python est parfait. C'est valable par rapport à Perl aussi bien que par rapport à Java et C++
salut heyquem,
Pour répondre à ta première question, je ne suis pas renseigné plus que ça sur le perl avant de me lancer. A vrai dire je suis en thèse de biologie et la programmation ce n'est pas vraiment ma spécialité :)
Cependant par rapport à mon sujet : l'étude de variation de l'ensemble des protéines suite à différents stress, je génère des quantités gigantesques de donnée. Chaque analyse génère des rapport d'abondance avant et après stress pour plus de 20 à 30000 protéines, sans compter le fait qu'on effectue au moins chacune des analyses en triplicats.
Pour intégrer et tirer du sens dans tout ça, j'utilise massivement les statistiques. Mais une fois les candidats protéiques sélectionnés il faut encore que j'étudie les séquences, et ce, souvent à l'aide d'algo déjà écrit en perl. En fait je crois que dans la bio ce langage reste encore très utilisé pour tout ce qui touche à l'analyse de séquence.
En tout cas ce sont les bio-informaticiens de mon labo qui bossent en perl et qui m'on conseillé de me lancer dans cet apprentissage.
Mais bon si tu me dit que le python est plus simple et plus facile d'accès je vais peut être m'y pencher un peu pour voir si il me permettra d'arriver à ce que je veux !
Mer ci pour tes conseils ;)
Pour répondre à ta première question, je ne suis pas renseigné plus que ça sur le perl avant de me lancer. A vrai dire je suis en thèse de biologie et la programmation ce n'est pas vraiment ma spécialité :)
Cependant par rapport à mon sujet : l'étude de variation de l'ensemble des protéines suite à différents stress, je génère des quantités gigantesques de donnée. Chaque analyse génère des rapport d'abondance avant et après stress pour plus de 20 à 30000 protéines, sans compter le fait qu'on effectue au moins chacune des analyses en triplicats.
Pour intégrer et tirer du sens dans tout ça, j'utilise massivement les statistiques. Mais une fois les candidats protéiques sélectionnés il faut encore que j'étudie les séquences, et ce, souvent à l'aide d'algo déjà écrit en perl. En fait je crois que dans la bio ce langage reste encore très utilisé pour tout ce qui touche à l'analyse de séquence.
En tout cas ce sont les bio-informaticiens de mon labo qui bossent en perl et qui m'on conseillé de me lancer dans cet apprentissage.
Mais bon si tu me dit que le python est plus simple et plus facile d'accès je vais peut être m'y pencher un peu pour voir si il me permettra d'arriver à ce que je veux !
Mer ci pour tes conseils ;)
"En fait je crois que dans la bio ce langage reste encore très utilisé pour tout ce qui touche à l'analyse de séquence.
En tout cas ce sont les bio-informaticiens de mon labo qui bossent en perl et qui m'on conseillé de me lancer dans cet apprentissage."
Bien sûr, il y a une inertie dans tout. Ils t'ont conseillé Perl parce qu'ils pratiquent Perl, ça paraît tellement couler de source pour eux. Perl ayant été très utilisé à une époque et avec des qualités indéniables pour le genre de traitement que tu décris, il y a beaucoup de gens qui l'ont pratiqué et beaucoup parmi ceux-ci qui continuent à l'utiliser. Mais ça ne veut pas dire que Perl va rester le meilleur langage pour fair de la bio-informatique jusqu'à la fin des temps (et Python non plus d'ailleurs pour essayer d'être objectif). Seulement, ce serait bien que les vieux barbons avec de l'expérience cherchent aussi à comparer leurs outils anciens aux évolutions qui ont eu lieu depuis leurs apprentissages de leurs outils.
Je ne me fais aucun souci pour la capacité de Python à obtenir les mêmes résultats qu'avec Perl, non seulement de par ses qualités propres, mais aussi parce qu'il y a une quantité effarantes d'extensions dans tous les domaines et qu'il y en a évidemment pour faire de la bio-informatique. Tu peux en avoir une idée ici:
https://pypi.org/
L'un des atouts de Python est de pouvoir facilement utiliser des programmes dans d'autres langages. Ainsi est-il possible d'utiliser la bibliothèques du langage R qui possède beaucoup de programmes spécialisés en statistique, d'après ce que j'ai lu,car moi même je n'ai encore jamais pratiqué ce genre de recours à d'autres langages.
Encore un avantage: Python peut être utilisé comme liant entre systèmes hétérogènes. Par exemple, il permet de faire du contrôle d'appareils de façon très satisfaisante. C'est ce que j'ai lu d'un scientifique dans un numéro de GNU Linux Mag il y a 4 ou 5 ans.
Enfin bref, Python on peut en parler des heures. Mais le mieux à mon avis, c'est de le tester, et en parallèle avec un autre langage c'est à mon avis encore mieux, on voit tout de suite la différence.
Je peux te donner quelques tuyaux de départ si tu veux, bien que je n'ai pas trop de temps. Mais il y a des forums consacrés à Python qui t'apporteraient toutes les réponses voulues mieux qu'ici. Bon, tu vois.
En tout cas ce sont les bio-informaticiens de mon labo qui bossent en perl et qui m'on conseillé de me lancer dans cet apprentissage."
Bien sûr, il y a une inertie dans tout. Ils t'ont conseillé Perl parce qu'ils pratiquent Perl, ça paraît tellement couler de source pour eux. Perl ayant été très utilisé à une époque et avec des qualités indéniables pour le genre de traitement que tu décris, il y a beaucoup de gens qui l'ont pratiqué et beaucoup parmi ceux-ci qui continuent à l'utiliser. Mais ça ne veut pas dire que Perl va rester le meilleur langage pour fair de la bio-informatique jusqu'à la fin des temps (et Python non plus d'ailleurs pour essayer d'être objectif). Seulement, ce serait bien que les vieux barbons avec de l'expérience cherchent aussi à comparer leurs outils anciens aux évolutions qui ont eu lieu depuis leurs apprentissages de leurs outils.
Je ne me fais aucun souci pour la capacité de Python à obtenir les mêmes résultats qu'avec Perl, non seulement de par ses qualités propres, mais aussi parce qu'il y a une quantité effarantes d'extensions dans tous les domaines et qu'il y en a évidemment pour faire de la bio-informatique. Tu peux en avoir une idée ici:
https://pypi.org/
L'un des atouts de Python est de pouvoir facilement utiliser des programmes dans d'autres langages. Ainsi est-il possible d'utiliser la bibliothèques du langage R qui possède beaucoup de programmes spécialisés en statistique, d'après ce que j'ai lu,car moi même je n'ai encore jamais pratiqué ce genre de recours à d'autres langages.
Encore un avantage: Python peut être utilisé comme liant entre systèmes hétérogènes. Par exemple, il permet de faire du contrôle d'appareils de façon très satisfaisante. C'est ce que j'ai lu d'un scientifique dans un numéro de GNU Linux Mag il y a 4 ou 5 ans.
Enfin bref, Python on peut en parler des heures. Mais le mieux à mon avis, c'est de le tester, et en parallèle avec un autre langage c'est à mon avis encore mieux, on voit tout de suite la différence.
Je peux te donner quelques tuyaux de départ si tu veux, bien que je n'ai pas trop de temps. Mais il y a des forums consacrés à Python qui t'apporteraient toutes les réponses voulues mieux qu'ici. Bon, tu vois.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
hé hé effectivement il y a une grosse inertie dans les labo, et c'est valable pour tous les domaines malheureusement.
Je viens de passer un peu de temps à regarder un peu ce que propose le python et effectivement c'est un peu le jour et la nuit comparé au perl en terme de lisibilité. Je suis tombé sur un petit cour d'intro plutôt bien fait :http://python.developpez.com/cours/TutoSwinnen/?page=Chapitre4
Donc je crois que je vais m'y pencher un peu pour voir ce que je peux en faire, mais il a effectivement l'air prometteur et surtout beaucoup plus accessible !
En tout cas merci pour ton conseil et je suis preneur si tu as d'autre tuto intéressant !
Je viens de passer un peu de temps à regarder un peu ce que propose le python et effectivement c'est un peu le jour et la nuit comparé au perl en terme de lisibilité. Je suis tombé sur un petit cour d'intro plutôt bien fait :http://python.developpez.com/cours/TutoSwinnen/?page=Chapitre4
Donc je crois que je vais m'y pencher un peu pour voir ce que je peux en faire, mais il a effectivement l'air prometteur et surtout beaucoup plus accessible !
En tout cas merci pour ton conseil et je suis preneur si tu as d'autre tuto intéressant !
Tiens , d'ailleurs, je viens d'écrire en Python le programme pour faire ce que tu as décrit dans ta question, juste après avoir posté mon précédent message:
EDIT
Le code ci-dessus marchera pour n'importe quel fichier d'entrée, même s'il fait 35 GB
Si le fichier d'entrée n'est pas gigantesque, et qu'il peut être lu en entier, c'est à dire que son contenu peut être accueilli dans la RAM (par l'instruction f.read() ci dessous), le programme suivant fera le même travail, en lançant l'expression régulière regx sur tout le contenu du fichier d'un coup, pas ligne par ligne comme dans le précédent:
.
import re regx = re.compile(' Y [\d.]+ Signal') with open('bio.txt','r') as f: generY = (line for line in f if regx.search(line)) with open('sortie.txt','w') as g: g.writelines(generY)
EDIT
Le code ci-dessus marchera pour n'importe quel fichier d'entrée, même s'il fait 35 GB
Si le fichier d'entrée n'est pas gigantesque, et qu'il peut être lu en entier, c'est à dire que son contenu peut être accueilli dans la RAM (par l'instruction f.read() ci dessous), le programme suivant fera le même travail, en lançant l'expression régulière regx sur tout le contenu du fichier d'un coup, pas ligne par ligne comme dans le précédent:
import re regx = re.compile('^.+? Y [\d.]+ Signal.+\r?\n?',re.MULTILINE) with open('bio.txt','r') as f: lu = f.read() with open('sortie.txt','w') as g: g.writelines(regx.findall(lu))
.
A vrai dire , je n'ai jamais lu de tuto, et je n'aime pas tellement le Swinnen, il est trop lent à exposer les choses, et pas très bien à mon avis. Quelqu'un qui a un cerveau qu marche bien, il pige vite les choses, un tuto comme Swinnen fait durer durer, à mon avis. Enfin bon, chacun voit.
Je m'instruis sur Python en lisant attentivement la doc, qui est pas mal faite, bien qu'à la longue on s'aperçoit de quelques insuffisances, et en lisant de bons forums Python. Je te conseille le forum Python de developpez.com , en français, , et si tu veux lire du très haut niveau, il y a stackoverflow. Suis désolé de dire ça par rapport à ce site CCM, mais les intervenants Python ici ne sont pas légion, et comment dire , loin du niveau de stackoverflow. Pourtant c'est CCM qui m'a aidé à choisir Python parce qu'il ont des présentations de sujets bien faites, je trouve, et celle sur la prog m'a bien aidé à choisir.
Encore une chose:
"A vrai dire je suis en thèse de biologie et la programmation ce n'est pas vraiment ma spécialité"
Je crois que c'est justement pour des cas comme ça que Python est une bénédiction. Car en même temps, comment se passer de piger un minimum la prog dans un domaine comme la biologie moléculaire ou la génétique ? Hein, je vous le demande, Mme Michu.
edit
Tiens je viens de tomber là-dessus, ça a l'air pas mal pour s'imprégner rapidement de la syntaxe et de possibilités hyperbasiques de Python
https://www.stavros.io/tutorials/python/
Je m'instruis sur Python en lisant attentivement la doc, qui est pas mal faite, bien qu'à la longue on s'aperçoit de quelques insuffisances, et en lisant de bons forums Python. Je te conseille le forum Python de developpez.com , en français, , et si tu veux lire du très haut niveau, il y a stackoverflow. Suis désolé de dire ça par rapport à ce site CCM, mais les intervenants Python ici ne sont pas légion, et comment dire , loin du niveau de stackoverflow. Pourtant c'est CCM qui m'a aidé à choisir Python parce qu'il ont des présentations de sujets bien faites, je trouve, et celle sur la prog m'a bien aidé à choisir.
Encore une chose:
"A vrai dire je suis en thèse de biologie et la programmation ce n'est pas vraiment ma spécialité"
Je crois que c'est justement pour des cas comme ça que Python est une bénédiction. Car en même temps, comment se passer de piger un minimum la prog dans un domaine comme la biologie moléculaire ou la génétique ? Hein, je vous le demande, Mme Michu.
edit
Tiens je viens de tomber là-dessus, ça a l'air pas mal pour s'imprégner rapidement de la syntaxe et de possibilités hyperbasiques de Python
https://www.stavros.io/tutorials/python/
Pas de soucis, j'avais pas pensé qu'on pouvais le faire en bash, mais ca à l'air un peu plus simple et surtout ça marche, j'ai réussi à obtenir mon fichier, en modifiant un peu ta commande:
$ awk '/^KI/ && / Y / { print $0}' sortie_signalP>sortie.txt
Sur mon fichier à traiter les nom de protéines commençaient par KI au lieu de IPI et j'ai un peu galéré pour reussir à trouver comment imprimer dans un fichier plutôt que dans la console mais j'ai bien obtenu ce que je voulais !
Par contre je n'ai pas bien compris ce que représentait $0 après le print ?
Bonne journée
Jo
$0 représente la ligne en cours, mais c'est facultatif, un print tout court aura le même effet.
ah ? et alors à quoi sert de mettre ces caractères non indispensables?
soit dit en passant, tu connais bien Perl ? quel(s) langage(s) utilises-tu ?
A faire joli ;-))
Non, en fait je ne connais que très sommairement awk et ne maîtrise pas toutes ses subtilités. Peut être aussi que sur certaines versions ce paramètre est indispensable, donc dans le doute, ça ne mange pas de pain.
soit dit en passant, tu connais bien Perl ? quel(s) langage(s) utilises-tu ?
Non, pas du tout. Et pour le langage, je n'en maîtrise et connais aucun, juste de bonnes bases en shell bash.