#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
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
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
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
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
bizarrement, avec awk, ça ne semble pas marcher ! 'faut que je regarde de plus près
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
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
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
-- 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