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 29/09/2008, à 19:05

mezhoud

[résolu] élimination du retour chariot dans un fichier texte

Bonsoir,
J'ai téléchargé le protéome d'une bactérie (c'est l'ensemble de protéines synthétisées par une bactérie) qui ce présente sous cette forme:

>référence de la protéines avec son nom (retour à la ligne)
BFKKSDLJSNBKFSKNFKSLKJSLFSLKJGLG (retour à la ligne)
JHBSJBSQLKJBNSQNBGLKJSGKJNSDJKNGSDKJNGSDKNG: séquence de protéine
............................................................................. (retour à la ligne)
> référfence de la deuxième protéine (RETOUR À LA LIGNE)
NLKJELCJH,JTG,ZIJCIORJGZCP,OCJ,ZOJRTZOBINUYNCHZVOH(retour à la ligne)

.
.
.


Je voudrais bien enlevé le retour à la ligne qui intérompe les séquences de protéine mais je voudrais bien garder celui des ligne commençant par > et celui qui finit la séquence càd avant le >.

de tel sorte que j'aurai:

>référence (retour à la ligne)
séquence de caractères
>références 2 ème protéine
séquence de caractères
>.......

sous vim il parait qu'il y a la commane \n ou bien \p mais je ne sais pas plus.



Auriez vous une idée?

merci d'avance

Dernière modification par mezhoud (Le 30/09/2008, à 12:32)

Hors ligne

#2 Le 29/09/2008, à 19:41

tiky

Re : [résolu] élimination du retour chariot dans un fichier texte

Je ne connais pas Vim puisque j'utilise Emacs mais je pense que la commande sed peut répondre à tes attentes.


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#3 Le 29/09/2008, à 20:00

mezhoud

Re : [résolu] élimination du retour chariot dans un fichier texte

Merci ,
voici mon idée mais elle n'ai pas juste et incomplète. Je ne suis pas un informaticien.


cat monfichier.txt | sed -e 's/^./$retourchariot/ rien/'

remplacer la ligne qui commence par n'importe quelle caractère(^.) et à la fin ($) par rien (qu est ce qu'il faut mettre?)/
mais il faut ajouter que les lignes qui commence par > ne doivent pas être toucher et celles avant.

merci

Hors ligne

#4 Le 29/09/2008, à 20:14

®om

Re : [résolu] élimination du retour chariot dans un fichier texte

sed ':a;N;$!ba;s/\n\([^>]\)/\1/g' monfichier.txt

(presque)

Dernière modification par ®om (Le 29/09/2008, à 20:15)

Hors ligne

#5 Le 29/09/2008, à 20:16

Totor

Re : [résolu] élimination du retour chariot dans un fichier texte

Salut,

En fait, dans ton cas et si j'ai bien compris, il te faut supprimer les lignes vides.
J'anticipe un peu mais peut-être qu'elles ne sont pas si vides que ça : espaces, tabulations peuvent être présents.

sed est une solution, grep une autre wink

avec grep, on peut lui demander de ne pas afficher les lignes correspondant à l'expression :

grep -v '^[[:blank:]]*$' monfichier.txt

avec sed, on lui dit de ne pas les afficher (attention au -n) :

sed -n '/^[[:blank:]]*$/!p' monfichier.txt

...ou de les supprimer :

sed '/^[[:blank:]]*$/d' monfichier.txt

bizarrement, avec awk, ça ne semble pas marcher ! 'faut que je regarde de plus près wink

voilà ...


-- Lucid Lynx --

Hors ligne

#6 Le 29/09/2008, à 20:36

mezhoud

Re : [résolu] élimination du retour chariot dans un fichier texte

J'ai esayé d'appliquer ces codes sur cet exemple (deux séquence mais mon fichier contient 6000). je n'ai pas remarqué de différence.



[doc]>gi|15805043|ref|NP_293727.1| DNA polymerase III, beta subunit [Deinococcus radiodurans R1]
MMKANVTKKTLNEGLGLLERVIPSRSSNPLLTALKVETSEGGLTLSGTNLEIDLSCFVPAEVQQPENFVV
PAHLFAQIVRNLGGELVELELSGQELSVRSGGSDFKLQTGDIEAYPPLSFPAQADVSLDGGELSRAFSSV
RYAASNEAFQAVFRGIKLEHHGESARVVASDGYRVAIRDFPASGDGKNLIIPARSVDELIRVLKDGEARF
TYGDGMLTVTTDRVKMNLKLLDGDFPDYERVIPKDIKLQVTLPATALKEAVNRVAVLADKNANNRVEFLV
SEGTLRLAAEGDYGRAQDTLSVTQGGTEQAMSLAFNARHVLDALGPIDGDAELLFSGSTSPAIFRARRWG
RRVYGGHGHAARLRGLLRPLRGMSALAHHPESSPPLEPRPEFA
>gi|15805044|ref|NP_293728.1| chromosomal replication initiator protein [Deinococcus radiodurans R1]
MRKNVSDLEYTTWFAPVKPLGVQEGSLLLGVRNSFTKDWFRDHYLELLLAALRSLGAEHPQVEFQVLPAA
QDALLLPNDPPPAPEAAAPTPKTKAAPTPPPSTPGDNRKTLNPKYTFENFVVGPNNNLAHAAALAVAESP
GKAYNPLFIYGDVGLGKTHLMHAVGHYLAERFPEKRIEYVSTETFTNELINAIRDDKTTQFRNRYRSVDL
LLVDDIQFLAGKERTQEEFFHTFNALYESNKQIILSSDRPPKDIQTLEGRLRSRFEWGLITDIQSPEYET
RVAILKMNAEQGHITIPQEVLELIARQVTSNIRELEGALMRVVAFASLNNVPFSRAAAAKALSNVFAPQE
AKVEMTDVLRQVAAHYGTTPDLIRGSGRARDIVVPRQVAQYLIRALTDHSLPEIGQFFGRDHSTVMHAVS
KITEQMGKDPELAATVNTLRNRIQGKEEEEEVGA[/doc]

Hors ligne

#7 Le 29/09/2008, à 20:45

Totor

Re : [résolu] élimination du retour chariot dans un fichier texte

les 3 instructions que je t'ai donné sont 3 façons différentes de faire la même chose : ce que tu as demandé !


-- Lucid Lynx --

Hors ligne

#8 Le 29/09/2008, à 20:57

mezhoud

Re : [résolu] élimination du retour chariot dans un fichier texte

Oui merci j'ai bien compris,
Mais,

J'ai fait un copier/coller de chacune sur mon terminal et j'ai mis le nom de mon fichier (je suis bien sûr dans le répertoire du fichier). Le résultat est le même.
Quand j'ouvre le fichier avec gedit ou ooffice les retour chariot existent.

Je n'ai pas eu un message d'erreur

merci beacoup

Hors ligne

#9 Le 29/09/2008, à 21:00

sebk

Re : [résolu] élimination du retour chariot dans un fichier texte

De façon moins élégante, tu peux essayer le code suivant :

#!/bin/bash

tot=""
while read ligne
do
	if [ ${ligne:0:1} == ">" ]
	then
		if [ "$tot" != "" ]
		then
			echo "$tot" >> adn_cnv
			tot=""
		fi
		echo "$ligne" >> adn_cnv
	else
		tot="$tot$ligne"
	fi
done < adn

echo "$tot" >> adn_cnv

remplace le fichier adn par celui que tu souhaite.


Iceberg Project : www.iceberg-linux.net

Hors ligne

#10 Le 29/09/2008, à 21:17

mezhoud

Re : [résolu] élimination du retour chariot dans un fichier texte

OUI cela a marché merci beaucoup.

j'ai eu un nouveau fichier monfichier_cnv qui est sans retour chariot.


Mais au lieu de retapper à chaque fois cela, comment je peux remdre ce code exécutable?

Hors ligne

#11 Le 29/09/2008, à 21:25

sebk

Re : [résolu] élimination du retour chariot dans un fichier texte

mezhoud a écrit :

OUI cela a marché merci beaucoup.

j'ai eu un nouveau fichier monfichier_cnv qui est sans retour chariot.


Mais au lieu de retapper à chaque fois cela, comment je peux remdre ce code exécutable?

si tu a pus le lancer, c'est que tu l'a rendu exécutable non ?

Sinon, tu met tout ça dans un fichier texte, tu fait un "chmod 777 xxx" où xxx est le fichier texte et c'est devenu un éxécutable.

Si c'est pour rendre le fichier en entrée exécutable, tu remplace chaque "adn" par $1 et c'est le paramètre qui sera pris en compte par ton programme.

Par exemple si ton programme s'appel transco_adn, tu tapes :

transco_adn mon_fichier

Iceberg Project : www.iceberg-linux.net

Hors ligne

#12 Le 29/09/2008, à 21:29

mezhoud

Re : [résolu] élimination du retour chariot dans un fichier texte

OUi c'est ce que j'ai oublié.

MERCI BEAUCOUP

Exercice résolu

Hors ligne

#13 Le 30/09/2008, à 00:01

fred66100

Re : [résolu] élimination du retour chariot dans un fichier texte

Bonjour mezhoud

Merci de nous dire que ton problème est résolu.

Par respect pour les bénévoles, qui aident les âmes en peine sur ce forum, pourrai-tu écrire [Résolu] au début du titre de ton message.

Pour cela retourne à ton premier message.
Clic sur "Modifier" (en rouge, en bas à droite du dit message).
Le formulaire d'écriture de ton premier message doit apparaître.
Met ton pointeur au début du titre du premier message.
Tape [Résolu].
Clic sur Poster.

Cela simplifiera la tâche des bénévoles ainsi que la recherche des autres visiteurs.

Merci de ta compréhension.


Le savoir ne sert à rien s'il n'est pas partagé.      Errare humanum est.      Cordonnier, pas plus haut que la chaussure.

Hors ligne

#14 Le 30/09/2008, à 07:18

Totor

Re : [résolu] élimination du retour chariot dans un fichier texte

mezhoud a écrit :

Oui merci j'ai bien compris,
Mais,

J'ai fait un copier/coller de chacune sur mon terminal et j'ai mis le nom de mon fichier (je suis bien sûr dans le répertoire du fichier). Le résultat est le même.
Quand j'ouvre le fichier avec gedit ou ooffice les retour chariot existent.

Je n'ai pas eu un message d'erreur

merci beacoup

oui, c'est normal, la modification ne s'effectue pas directement dans le fichier !
pour ce faire (avec sed) :

sed -i '/^[[:blank:]]*$/d' monfichier.txt

l'option -i permet d'effectuer les modifications directement dans le fichier.


-- Lucid Lynx --

Hors ligne

#15 Le 30/09/2008, à 12:58

mezhoud

Re : [résolu] élimination du retour chariot dans un fichier texte

Totor a écrit :

bizarrement, avec awk, ça ne semble pas marcher ! 'faut que je regarde de plus près wink

Voila le script avec awk:


#!/bin/bash
#enlever les retour chariot dans un fichier texte
$ cat nom-script
BEGIN {}

/^[^>]/ {
  IN_SEQ=1;
  SEQ=$0;
  while (IN_SEQ==1) {
    if (getline)
      if (index($0, ">")) {
        IN_SEQ=0}
      else {
        SEQ = SEQ "," $0
      }
    else
      IN_SEQ=0
  }
  print SEQ
}

/^>/ {print $0}

END {}

Tu auras a lancer ce script avec:

$ awk -f nom-script mon-fichier

merci à tous

Hors ligne

#16 Le 30/09/2008, à 19:59

Totor

Re : [résolu] élimination du retour chariot dans un fichier texte

lol
oui oui merci bien mais ce que j'ai essayé de te montrer c'est qu'il y a plein de solution grep, sed ou awk. mais je m'y suis probablement mal pris !

je pensais plutôt à quelque chose dans le style :

awk ' $0 !~ /^[[:blank:]]*$/ {print}' fichier.txt

c'est ça qui ne fonctionne pas hmm

par contre, si je remplace [[:blank:]] par les valeurs possibles, ça le fait :

awk ' $0 !~ /^[ \t]*$/ {print}' fichier.txt

comme quoi, tout comme avec sed, il peut y a plusieurs solutions avec le même outil.;)


-- Lucid Lynx --

Hors ligne

#17 Le 01/10/2008, à 10:29

aleph

Re : [résolu] élimination du retour chariot dans un fichier texte

... mais je m'y suis probablement mal pris !

C'est parce que tu essaies de traiter chaque ligne indépendamment du contenu
des autres. Mehzoud introduit un flag, IN_SEQ, permettant de différencer
le traitement de chaque ligne.

Ce genre de problème est souvent plus tordu qu'il n'y paraît au premier
abord. Illustration avec une console Python et un peu de ruse.

Le contenu du protéome comme s'il avait été lu par un "readlines()". Une liste
de lignes. Les '\n' sont visibles.

>>> r
['>gi|15805043|ref|NP_293727.1| DNA polymerase III, beta subunit [Deinococcus
radiodurans R1]\n',
'MMKANVTKKTLNEGLGLLERVIPSRSSNPLLTALKVETSEGGLTLSGTNLEIDLSCFVPAEVQQPENFVV\n',
'PAHLFAQIVRNLGGELVELELSGQELSVRSGGSDFKLQTGDIEAYPPLSFPAQADVSLDGGELSRAFSSV\n',
'RYAASNEAFQAVFRGIKLEHHGESARVVASDGYRVAIRDFPASGDGKNLIIPARSVDELIRVLKDGEARF\n',
'TYGDGMLTVTTDRVKMNLKLLDGDFPDYERVIPKDIKLQVTLPATALKEAVNRVAVLADKNANNRVEFLV\n',
'SEGTLRLAAEGDYGRAQDTLSVTQGGTEQAMSLAFNARHVLDALGPIDGDAELLFSGSTSPAIFRARRWG\n',
'RRVYGGHGHAARLRGLLRPLRGMSALAHHPESSPPLEPRPEFA\n', '>gi|15805044|ref|NP_293728.1|
chromosomal replication initiator protein [Deinococcus radiodurans R1]\n',
'MRKNVSDLEYTTWFAPVKPLGVQEGSLLLGVRNSFTKDWFRDHYLELLLAALRSLGAEHPQVEFQVLPAA\n',
'QDALLLPNDPPPAPEAAAPTPKTKAAPTPPPSTPGDNRKTLNPKYTFENFVVGPNNNLAHAAALAVAESP\n',
'GKAYNPLFIYGDVGLGKTHLMHAVGHYLAERFPEKRIEYVSTETFTNELINAIRDDKTTQFRNRYRSVDL\n',
'LLVDDIQFLAGKERTQEEFFHTFNALYESNKQIILSSDRPPKDIQTLEGRLRSRFEWGLITDIQSPEYET\n',
'RVAILKMNAEQGHITIPQEVLELIARQVTSNIRELEGALMRVVAFASLNNVPFSRAAAAKALSNVFAPQE\n',
'AKVEMTDVLRQVAAHYGTTPDLIRGSGRARDIVVPRQVAQYLIRALTDHSLPEIGQFFGRDHSTVMHAVS\n',
'KITEQMGKDPELAATVNTLRNRIQGKEEEEEVGA\n']

Traitement et astuce. Remplacer un '>' par un '\n>' si nécessaire.
A noter le "\n" *avant* le ">" !

>>> s = ''
>>> for e in r:
        if e.startswith('>'):
            s += '\n' + e
        else:
            s += e.rstrip()
           
>>> # Fini. Enlever le "\n" inutile du début et en ajouter un à la fin
>>> s = s[1:] + '\n'

Résultat avec les "\n" visibles.

>>> repr(s)
'>gi|15805043|ref|NP_293727.1| DNA polymerase III, beta subunit [Deinococcus radiodurans
R1]\nMMKANVTKKTLNEGLGLLERVIPSRSSNPLLTALKVETSEGGLTLSGTNLEIDLSCFVPAEVQQPENFVVPAHLFAQIVRNLGGELVELELSGQELSVRSGG
SDFKLQTGDIEAYPPLSFPAQADVSLDGGELSRAFSSVRYAASNEAFQAVFRGIKLEHHGESARVVASDGYRVAIRDFPASGDGKNLIIPARSVDELIRVLKDGEAR
FTYGDGMLTVTTDRVKMNLKLLDGDFPDYERVIPKDIKLQVTLPATALKEAVNRVAVLADKNANNRVEFLVSEGTLRLAAEGDYGRAQDTLSVTQGGTEQAMSLAFN
ARHVLDALGPIDGDAELLFSGSTSPAIFRARRWGRRVYGGHGHAARLRGLLRPLRGMSALAHHPESSPPLEPRPEFA\n>gi|15805044|ref|NP_293728.1
| chromosomal replication initiator protein [Deinococcus radiodurans
R1]\nMRKNVSDLEYTTWFAPVKPLGVQEGSLLLGVRNSFTKDWFRDHYLELLLAALRSLGAEHPQVEFQVLPAAQDALLLPNDPPPAPEAAAPTPKTKAAPTPPPS
TPGDNRKTLNPKYTFENFVVGPNNNLAHAAALAVAESPGKAYNPLFIYGDVGLGKTHLMHAVGHYLAERFPEKRIEYVSTETFTNELINAIRDDKTTQFRNRYRSVD
LLLVDDIQFLAGKERTQEEFFHTFNALYESNKQIILSSDRPPKDIQTLEGRLRSRFEWGLITDIQSPEYETRVAILKMNAEQGHITIPQEVLELIARQVTSNIRELE
GALMRVVAFASLNNVPFSRAAAAKALSNVFAPQEAKVEMTDVLRQVAAHYGTTPDLIRGSGRARDIVVPRQVAQYLIRALTDHSLPEIGQFFGRDHSTVMHAVSKIT
EQMGKDPELAATVNTLRNRIQGKEEEEEVGA\n'

#18 Le 01/10/2008, à 13:13

Totor

Re : [résolu] élimination du retour chariot dans un fichier texte

nop, la raison est que je ne fais pas ce qu'il a demandé :
j'avais bien indiqué que ce que je comprenais de son premier post est qu'il souhaitais supprimer les lignes blanches et non pas concaténer les lignes de séquences....
je m'y pencherai plus tard pour essayer de faire un script plus "allégé" ...

Dernière modification par Totor (Le 01/10/2008, à 13:13)


-- Lucid Lynx --

Hors ligne

#19 Le 01/10/2008, à 19:40

Totor

Re : [résolu] élimination du retour chariot dans un fichier texte

Voici mon premier jet :

awk  ' /^>/ { if (ligne != "") { print ligne }; print; ligne=""; next} { ligne=ligne""$0} END {if (ligne != "") {print ligne}}' seq.txt

-- Lucid Lynx --

Hors ligne

#20 Le 01/10/2008, à 20:49

Totor

Re : [résolu] élimination du retour chariot dans un fichier texte

Ma seconde tentative (bien moins compréhensible, je l'accorde) :

sed ':s;s/>\([^<]*\)$/>\1</;N;s/\n//g;bs' seq.txt|sed 's/>/\n>/g;s/</\n/g'|sed 1d

Explications :
En gros, j'encadre tous éléments de lignes à partir du caractère > et jusqu'au retour chariot (RC) entre > et < (s/>\([^<]*\)$/>\1</)
Je concatène toutes les lignes entre elles en supprimant les RC (N;s/\n//g;bs : le bs, c'est pour revenir à l'étiquette posée avec :s. Si on ne fait pas cela, sed affiche son buffer et donc le traitement n'est valable que sur 2 lignes !)

cela me donne un premier flux

Sur le flux obtenu, je remplace tous les > par un RC + > (s/>/\n>/g)
et je remplace tous les < par un RC (s/</\n/g).

Cela me donne un second flux auquel je supprime la 1ère ligne correspondant à une ligne vide issue du remplacement d'un > par RC + > (1d)

enfin bon, c'est "complexe" et pas vraiment compréhensible ! Donc pas la meilleure solution.
c'est du sed quoi wink


-- Lucid Lynx --

Hors ligne

#21 Le 01/10/2008, à 21:11

aleph

Re : [résolu] élimination du retour chariot dans un fichier texte

"""usage: [prompt]python proteom.py filein fileout"""

import sys

def main():
    
    #arguments de la ligne de commande
    filein = sys.argv[1]
    fileout = sys.argv[2]
    
    #lecture
    f = open(filein, 'r')
    r = f.readlines()
    f.close()

    #traitement
    s = ''
    for e in r:
        if e.startswith('>'):
            s += '\n' + e
        else:
            s += e.rstrip()
    s = s[1:] + '\n'
    
    #sauvegarde
    f = open(fileout, 'w')
    f.write(s)
    f.close()

if __name__ == '__main__':
    main()

#eof