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 10/11/2008, à 16:24

KicheTof

[Résolu] Extraire morceau de texte dans une variable

Hello à tous !

Je vous expose ma problématique, afin d'optimiser une saisie dans un programme, je peux exporter/importer un fichier texte ce qui me rend la tache nettement plus rapide.

Et pour l'augmenter encore, j'aimerai extraire une autre partie, mais la, je sèche.

Voici à quoi ça ressemble :

  -ISIS-  11100814082D

 30 33  0  0  0  0  0  0  0  0999 V2000
   -0.2500    0.8125    0.0000 N   0  0  3  0  0  0  0  0  0  0  0  0
    0.3167    0.5458    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.7542    1.0958    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -0.2833    1.4458    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.3792    1.6625    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    1.7667    0.5625    0.0000 N   0  3  0  0  0  0  0  0  0  0  0  0
    1.4167    1.1208    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -3.1958    1.6958    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -3.7708    2.6958    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -3.7708    1.3708    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
   -4.3333    1.7125    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -3.1958    2.3708    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -4.3333    2.3500    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -0.8000    0.4458    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -1.3958    0.7333    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -2.6125    1.3708    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.5292   -0.0917    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
    1.5167   -0.0667    0.0000 O   0  5  0  0  0  0  0  0  0  0  0  0
   -0.8000    1.8958    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
   -2.6125    2.6958    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    2.4375    0.5500    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
   -2.0333    1.7125    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -1.4333    1.3958    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
   -4.9333    1.3958    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
   -2.0208    0.3333    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
   -2.0333    2.3500    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.6542    2.2708    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -3.7708    3.3708    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    1.7042    1.7333    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    1.3292    2.3125    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
  2  1  1  0  0  0  0
  3  2  1  0  0  0  0
  4  1  1  0  0  0  0
  5  4  1  0  0  0  0
  6  7  1  0  0  0  0
  7  3  1  0  0  0  0
  8 16  2  0  0  0  0
  9 12  1  0  0  0  0
 10  8  1  0  0  0  0
 11 10  1  0  0  0  0
 12 20  2  0  0  0  0
 13  9  2  0  0  0  0
 14  1  1  0  0  0  0
 15 14  1  0  0  0  0
 16 22  1  0  0  0  0
 17  2  2  0  0  0  0
 18  6  1  0  0  0  0
 19  4  2  0  0  0  0
 20 26  1  0  0  0  0
 21  6  2  0  0  0  0
 22 23  1  0  0  0  0
 23 15  1  0  0  0  0
 24 11  2  0  0  0  0
 25 15  2  0  0  0  0
 26 22  2  0  0  0  0
 27  5  1  0  0  0  0
 28  9  1  0  0  0  0
 29  7  2  0  0  0  0
 30 27  2  0  0  0  0
  3  5  2  0  0  0  0
 29 30  1  0  0  0  0
 12  8  1  0  0  0  0
 11 13  1  0  0  0  0
M  CHG  2   6   1  18  -1
M  END
>  <ID> (5912418)
5912418

J'aimerai avoir un script bash qui va mettre dans une variable le champ allant de -ISIS jusqu'a M END avec toute la série de chiffre avec leur retour à la ligne et deuxièment, afin de compléter mon 2ème fichier, récupérer l'ID (le chiffre entre ( ) ou alors l'autre, c'est le même).

Je sais pas si vous m'avez compris ?

Pour information, la série de chiffre comprise entre -ISIS et M END est "aléatoire", il peut y avoir plus ou moins de chiffre (ils correspondent à une structure d'une molécule)

Ensuite j'aurai une 2ème question, mais je ne veux pas vous embrouillé avec, car sans la 1ère réponse, la 2ème ne peut venir smile

Merci beaucoup pour votre aide ! smile


J'ai oublié de préciser, le fichier fais plus de 7000 ligne avec ce code qui se répète (les chiffre change tongue) donc on peut pas se baser sur le n° de ligne

Dernière modification par KicheTof (Le 20/11/2008, à 12:53)


Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO

Hors ligne

#2 Le 11/11/2008, à 14:09

thierry2351

Re : [Résolu] Extraire morceau de texte dans une variable

Si ton texte est dans un fichier nommé "texte" :

Tu peux utiliser sed pour récupérer la partie du document entre deux lignes contenant un motif donné :

v1=$(cat texte |sed -n -e'/-ISIS/,/M  END/  p')

Pour aller plus loin, il y a une excellente doc sur sed à :
http://www.grymoire.com/Unix/Sed.html
Pour récupérer l'ID sur la dernière ligne, tu peux utiliser  :

 id=$(tail -1 texte)

Hors ligne

#3 Le 11/11/2008, à 16:45

KicheTof

Re : [Résolu] Extraire morceau de texte dans une variable

Hello !

Merci pour ta réponse, je testerai le sed smile je n'avais pas trouvé comment définir mes 2 délimiteurs sad

Pour le ID, comme je l'ai dis, ce bout de texte se répète environ 100x et il y a encore 2-3 truc après mais dans le même genre mais je ferai des testes, mon plus gros souci était les délimiteurs smile

Merci


Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO

Hors ligne

#4 Le 12/11/2008, à 16:28

KicheTof

Re : [Résolu] Extraire morceau de texte dans une variable

Hello !

malheureusement ça me supprime tout sauf ce que j'ai besoin... :S

j'ai trouvé ça sur ton lien, http://www.grymoire.com/Unix/Sed.html#uh-51

on peut peut-être s'en servir smile


Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO

Hors ligne

#5 Le 12/11/2008, à 19:43

thierry2351

Re : [Résolu] Extraire morceau de texte dans une variable

malheureusement ça me supprime tout sauf ce que j'ai besoin... :S

Qu'est-ce qui ne va pas au juste ?

Hors ligne

#6 Le 13/11/2008, à 09:56

KicheTof

Re : [Résolu] Extraire morceau de texte dans une variable

Voila ce que j'ai

un fichier test_sed

  -ISIS-  10150816332D

  8  0  0  0  0  0  0  0  0  0999 V2002
  9  0  0  0  0  0  0  0  0  0  0  0  0  0  0  6
  7  0  0  0  0  0  7
M  END
>  <ID> (1)
1

>  <champ2> (1)
test-sed

Et quand je lance la commande, voila le retour

Tof@acer:~/Bureau$ echo $(cat test_sed | sed -n -e'/-ISIS/,/M END/ p')
 1 > <champ2> (1) test-sed002 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 7 0 0 0 0 0 7

J'ai changé les 0 0 0 0 0 0  par des chiffres en début et fin afin de mieux voir qui est affiché wink


Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO

Hors ligne

#7 Le 13/11/2008, à 12:39

thierry2351

Re : [Résolu] Extraire morceau de texte dans une variable

Salut,
Hmm... Si je lance :

echo $(cat test_sed | sed -n -e'/-ISIS/,/M END/ p')

sur le fichier test_sed copié depuis ton message, j'obtiens :
-ISIS- 10150816332D 8 0 0 0 0 0 0 0 0 0999 V2002 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 7 0 0 0 0 0 7 M END > <ID> (1) 1 > <champ2> (1) test-sed

Ce qui est parfaitement normal :
- l'option -n demande de ne pas imprimer chaque ligne traitée
- à partir de la première ligne contenant "-ISIS", on affiche chaque ligne (p)
- on le fait jusqu'à rencontrer une ligne contenant "M END" . Comme ill n'y en a pas (il y a deux espaces dans ton fichier entre M et END, un seul dans ta commande...), on va jusqu'au bout.

Ensuite, faire "echo $variable" supprime les retours à la ligne. Il faut faire :
echo "$variable" pour les conserver (une des innombrables petites complexités du shell...)

Le dernier problème : tes lignes se recouvrent. C'est sans doute parce que ton texte vient d'un logiciel sous Windows : les marques de fin de lignes ne sont pas les mêmes (un caractère \x0a (LF = \n ) sous Unix, deux caractères \x0d \x0a (CR-LF = \r\n) sous Windows entre autres...).

Les CR cachés te ramènent à la ligne. Ce n'est pas gênant si tu utilises les guillemets :

$ echo "$(cat test_sed | sed -n -e'/-ISIS/,/M END/ p')"
  -ISIS-  10150816332D

  8  0  0  0  0  0  0  0  0  0999 V2002
  9  0  0  0  0  0  0  0  0  0  0  0  0  0  0  6
  7  0  0  0  0  0  7
M  END
>  <ID> (1)
1

>  <champ2> (1)
test-sed

Sinon, tu peux les supprimer au passage :
echo $(cat test_sed | tr -d '\r'| sed -n -e'/-ISIS/,/M END/ p')
ou
$ echo $(cat test_sed |sed s'/\r//'| sed -n -e'/-ISIS/,/M END/ p'

Il y a aussi de petits outils qui font la conversion :
tofromdos, flip ...

Hors ligne

#8 Le 13/11/2008, à 13:04

KicheTof

Re : [Résolu] Extraire morceau de texte dans une variable

Je suis blond... lol

j'avais pas tilté les 2 espaces... et merci pour les " " pour conserver les retours de lignes.

Effectivement ça provient de windows pour y retourner, mais comme j'aime pas la ligne de commande sous windows, je le fais sur ubuntu big_smile

$ echo "$(cat test_sed | sed -n -e'/-ISIS/,/M  END/ p')"
  -ISIS-  10150816332D

  8  0  0  0  0  0  0  0  0  0999 V2002
  9  0  0  0  0  0  0  0  0  0  0  0  0  0  0  6
  7  0  0  0  0  0  7
M  END

Donc parfait !

Maintenant va arriver qqch de complexe...

Il faut aussi récupérer l'ID correspondant a -ISIS .. M  END (celui en dessous) et ensuite, il faut réinjecter la valeur -ISIS ... M  END dans un autre fichier en fonction du ID...

je sais pas si j'ai été clair big_smile

Pour expliquer, en gros j'ai ceci

  -ISIS-  11100814082D

 30 33  0  0  0  0  0  0  0  0999 V2000
   -0.2500    0.8125    0.0000 N   0  0  3  0  0  0  0  0  0  0  0  0
    0.3167    0.5458    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.7542    1.0958    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -0.2833    1.4458    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.3792    1.6625    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    1.7667    0.5625    0.0000 N   0  3  0  0  0  0  0  0  0  0  0  0
    1.4167    1.1208    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -3.1958    1.6958    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -3.7708    2.6958    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -3.7708    1.3708    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
   -4.3333    1.7125    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -3.1958    2.3708    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -4.3333    2.3500    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -0.8000    0.4458    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -1.3958    0.7333    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -2.6125    1.3708    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.5292   -0.0917    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
    1.5167   -0.0667    0.0000 O   0  5  0  0  0  0  0  0  0  0  0  0
   -0.8000    1.8958    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
   -2.6125    2.6958    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    2.4375    0.5500    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
   -2.0333    1.7125    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -1.4333    1.3958    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
   -4.9333    1.3958    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
   -2.0208    0.3333    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
   -2.0333    2.3500    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.6542    2.2708    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -3.7708    3.3708    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    1.7042    1.7333    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    1.3292    2.3125    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
  2  1  1  0  0  0  0
  3  2  1  0  0  0  0
  4  1  1  0  0  0  0
  5  4  1  0  0  0  0
  6  7  1  0  0  0  0
  7  3  1  0  0  0  0
  8 16  2  0  0  0  0
  9 12  1  0  0  0  0
 10  8  1  0  0  0  0
 11 10  1  0  0  0  0
 12 20  2  0  0  0  0
 13  9  2  0  0  0  0
 14  1  1  0  0  0  0
 15 14  1  0  0  0  0
 16 22  1  0  0  0  0
 17  2  2  0  0  0  0
 18  6  1  0  0  0  0
 19  4  2  0  0  0  0
 20 26  1  0  0  0  0
 21  6  2  0  0  0  0
 22 23  1  0  0  0  0
 23 15  1  0  0  0  0
 24 11  2  0  0  0  0
 25 15  2  0  0  0  0
 26 22  2  0  0  0  0
 27  5  1  0  0  0  0
 28  9  1  0  0  0  0
 29  7  2  0  0  0  0
 30 27  2  0  0  0  0
  3  5  2  0  0  0  0
 29 30  1  0  0  0  0
 12  8  1  0  0  0  0
 11 13  1  0  0  0  0
M  CHG  2   6   1  18  -1
M  END
>  <ID> (5912418)
5912418

et il faut que je réinjecte -ISIS ... M  END dans ceci

  -ISIS-  10150816332D

  8  0  0  0  0  0  0  0  0  0999 V2002
  9  0  0  0  0  0  0  0  0  0  0  0  0  0  0  6
  7  0  0  0  0  0  7
M  END
>  <ID> (5912418)
5912418

>  <champ2> (1)
test-sed

>  <champ3> (1)
etc

Est-ce que j'ai été clair ?

Sachant que ce bloque peut se répéter une centaines de fois wink


Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO

Hors ligne

#9 Le 13/11/2008, à 13:32

thierry2351

Re : [Résolu] Extraire morceau de texte dans une variable

Je ne suis pas sûr d'avoir compris.
Tu veux concaténer tous les morceaux ayant le même id dans un fichier ?

Hors ligne

#10 Le 13/11/2008, à 14:27

KicheTof

Re : [Résolu] Extraire morceau de texte dans une variable

en gros, j'ai 2 fichiers avec comme seul informations identique, l'ID

Mon but est de remplacer dans un des fichiers ( contenant les balises -ISIS 0000 000 00 0 0 0) par celle contenant les valeurs du genre ( 30 33  0  0  0  0  0  0  0  0999 V2000
   -0.2500    0.8125    0.0000 N   0  0  3  0  0  0  0  0  0  0  0  0)

Tu vois un peu mieux ?


Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO

Hors ligne

#11 Le 13/11/2008, à 14:33

thierry2351

Re : [Résolu] Extraire morceau de texte dans une variable

Un court exemple avant/après avec la structure exacte (simplifiée) serait parfait !

Hors ligne

#12 Le 13/11/2008, à 14:39

KicheTof

Re : [Résolu] Extraire morceau de texte dans une variable

fichier 1

  -ISIS-  11100814082D

 30 33  0  0  0  0  0  0  0  0999 V2000
   -0.2500    0.8125    0.0000 N   0  0  3  0  0  0  0  0  0  0  0  0
    0.3167    0.5458    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.7542    1.0958    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -0.2833    1.4458    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.3792    1.6625    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    1.7667    0.5625    0.0000 N   0  3  0  0  0  0  0  0  0  0  0  0
    1.4167    1.1208    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -3.1958    1.6958    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -3.7708    2.6958    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -3.7708    1.3708    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
   -4.3333    1.7125    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -3.1958    2.3708    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -4.3333    2.3500    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -0.8000    0.4458    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -1.3958    0.7333    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -2.6125    1.3708    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.5292   -0.0917    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
    1.5167   -0.0667    0.0000 O   0  5  0  0  0  0  0  0  0  0  0  0
   -0.8000    1.8958    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
   -2.6125    2.6958    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    2.4375    0.5500    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
   -2.0333    1.7125    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -1.4333    1.3958    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
   -4.9333    1.3958    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
   -2.0208    0.3333    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
   -2.0333    2.3500    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.6542    2.2708    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -3.7708    3.3708    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    1.7042    1.7333    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    1.3292    2.3125    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
  2  1  1  0  0  0  0
  3  2  1  0  0  0  0
  4  1  1  0  0  0  0
  5  4  1  0  0  0  0
  6  7  1  0  0  0  0
  7  3  1  0  0  0  0
  8 16  2  0  0  0  0
  9 12  1  0  0  0  0
 10  8  1  0  0  0  0
 11 10  1  0  0  0  0
 12 20  2  0  0  0  0
 13  9  2  0  0  0  0
 14  1  1  0  0  0  0
 15 14  1  0  0  0  0
 16 22  1  0  0  0  0
 17  2  2  0  0  0  0
 18  6  1  0  0  0  0
 19  4  2  0  0  0  0
 20 26  1  0  0  0  0
 21  6  2  0  0  0  0
 22 23  1  0  0  0  0
 23 15  1  0  0  0  0
 24 11  2  0  0  0  0
 25 15  2  0  0  0  0
 26 22  2  0  0  0  0
 27  5  1  0  0  0  0
 28  9  1  0  0  0  0
 29  7  2  0  0  0  0
 30 27  2  0  0  0  0
  3  5  2  0  0  0  0
 29 30  1  0  0  0  0
 12  8  1  0  0  0  0
 11 13  1  0  0  0  0
M  CHG  2   6   1  18  -1
M  END
>  <ID> (5912418)
5912418

fichier 2

  -ISIS-  11100814082D

 0 0  0  0  0  0  0  0  0  0999 V2000
  0    0    0 0   0  0  0  0  0  0  0  0  0  0  0  0
  0    0    0 0   0  0  0  0  0  0  0  0  0  0  0  0
M  END
>  <ID> (5912418)
5912418

>  <champ2> (1)
test-sed

>  <champ3> (1)
etc

fichier de sortie

  -ISIS-  11100814082D

 30 33  0  0  0  0  0  0  0  0999 V2000
   -0.2500    0.8125    0.0000 N   0  0  3  0  0  0  0  0  0  0  0  0
    0.3167    0.5458    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.7542    1.0958    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -0.2833    1.4458    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.3792    1.6625    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    1.7667    0.5625    0.0000 N   0  3  0  0  0  0  0  0  0  0  0  0
    1.4167    1.1208    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -3.1958    1.6958    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -3.7708    2.6958    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -3.7708    1.3708    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
   -4.3333    1.7125    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -3.1958    2.3708    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -4.3333    2.3500    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -0.8000    0.4458    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -1.3958    0.7333    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -2.6125    1.3708    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.5292   -0.0917    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
    1.5167   -0.0667    0.0000 O   0  5  0  0  0  0  0  0  0  0  0  0
   -0.8000    1.8958    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
   -2.6125    2.6958    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    2.4375    0.5500    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
   -2.0333    1.7125    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -1.4333    1.3958    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
   -4.9333    1.3958    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
   -2.0208    0.3333    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
   -2.0333    2.3500    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.6542    2.2708    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -3.7708    3.3708    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    1.7042    1.7333    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    1.3292    2.3125    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
  2  1  1  0  0  0  0
  3  2  1  0  0  0  0
  4  1  1  0  0  0  0
  5  4  1  0  0  0  0
  6  7  1  0  0  0  0
  7  3  1  0  0  0  0
  8 16  2  0  0  0  0
  9 12  1  0  0  0  0
 10  8  1  0  0  0  0
 11 10  1  0  0  0  0
 12 20  2  0  0  0  0
 13  9  2  0  0  0  0
 14  1  1  0  0  0  0
 15 14  1  0  0  0  0
 16 22  1  0  0  0  0
 17  2  2  0  0  0  0
 18  6  1  0  0  0  0
 19  4  2  0  0  0  0
 20 26  1  0  0  0  0
 21  6  2  0  0  0  0
 22 23  1  0  0  0  0
 23 15  1  0  0  0  0
 24 11  2  0  0  0  0
 25 15  2  0  0  0  0
 26 22  2  0  0  0  0
 27  5  1  0  0  0  0
 28  9  1  0  0  0  0
 29  7  2  0  0  0  0
 30 27  2  0  0  0  0
  3  5  2  0  0  0  0
 29 30  1  0  0  0  0
 12  8  1  0  0  0  0
 11 13  1  0  0  0  0
M  CHG  2   6   1  18  -1
M  END
>  <ID> (5912418)
5912418

>  <champ2> (1)
test-sed

>  <champ3> (1)
etc
5912418

Dernière modification par KicheTof (Le 13/11/2008, à 14:41)


Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO

Hors ligne

#13 Le 13/11/2008, à 15:04

thierry2351

Re : [Résolu] Extraire morceau de texte dans une variable

Mmmm....
Un fichier contenant les données, avec des blocs :
-------------------
-ISIS.....
....
M END
><ID>...
...
-----------------
à la suite les uns des autres,

et un fichier 2 identique, à part les données entre -ISIS et M END (à remplacer par celles du premier) et des champs supplémentaires en fin de chaque bloc  - et avec des blocs pas forcément dans le même ordre. C'est ça ?

Hors ligne

#14 Le 13/11/2008, à 15:31

KicheTof

Re : [Résolu] Extraire morceau de texte dans une variable

En gros le fichier ressemble a ça

- ISIS
...
...
M  END
> <ID> ()
..

$$$$

et j'en ai un autre
- ISIS
...
...
M  END
> <ID> ()
..

> <champy> ()
..


> <champx> ()
..

$$$$

Et ça se répète et avant chaque -ISIS y'a une ligne avec 4 $$$$


Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO

Hors ligne

#15 Le 13/11/2008, à 15:42

aleph

Re : [Résolu] Extraire morceau de texte dans une variable

> KicheTof

> Effectivement ça provient de windows pour y retourner, mais comme j'aime pas la ligne de commande sous windows, je le fais sur ubuntu

---

Aujourd'hui, à la veille de 2009, pour effectuer ce genre de tâche, on ne travaille pas en ligne de commande que ce soit sous Windows, Ubuntu ou Solaris. Il existe des outils bien plus pratiques, souples et confortables comme les consoles interactives Python ou Ruby, langages très bien adaptés pour la manipulation de "strings". Et ceci sans compter l'aspect performance; lire en une passe le contenu d'un fichier de plusieurs milliers de lignes pour les manipuler par la suite et nettement plus optimal que parcourir ces milliers de lignes en devant lancer à chaque ligne une application de type sed.

La même remarque pourrait s'appliquer à mezhoud, http://forum.ubuntu-fr.org/viewtopic.php?id=267718 ,
qui à grand peine s'acharne à extraire des informations de bases de données protéomiques à coup de sed, awk alors que bien de gens le font avec une simple console Python, comme l'atteste la myriade de sites, pages web que l'on trouve sur la toile.

Illustration avec des données supposées sauvegardées dans le fichier data.txt.

>>> os.chdir('c:\\jm\\jmpy\\junk')
>>> os.listdir('.')
['essaipy2scite.py', 'data.txt']
>>> f = open('data.txt')
>>> r = f.readlines()
>>> f.close()
>>> #le contenu de data est dans la variable r sous forme de lignes
>>> #suppression des fins de lignes (indépendant de la plateforme)
>>> r = [ligne.rstrip() for ligne in r]
>>> for ligne in r:
        print ligne
        
  -ISIS-  11100814082D

 30 33  0  0  0  0  0  0  0  0999 V2000
   -0.2500    0.8125    0.0000 N   0  0  3  0  0  0  0  0  0  0  0  0
    0.3167    0.5458    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.7542    1.0958    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -0.2833    1.4458    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.3792    1.6625    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    1.7667    0.5625    0.0000 N   0  3  0  0  0  0  0  0  0  0  0  0
    1.4167    1.1208    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -3.1958    1.6958    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
>>> #etc

---

KicheTof, par curiosité, une question. C'est pour ISIS draw ou la base de données ISIS ?

#16 Le 13/11/2008, à 16:07

KicheTof

Re : [Résolu] Extraire morceau de texte dans une variable

Merci aleph pour ta réponse, est-ce que tu aurai des infos complète par rapport a ce que je souhaite ?

C'est pour ISIS Base wink Regroupement de plusieur fichier excel, export en .txt avec séparateur ; et création d'un fichier .sdf importable dans isis base, et pour augmenter la vitesse, exportation de la structure et de l'id depuis une autre bdd isis pour l'incorporer dans une nouvelle, malheureusement, je n'ai rien trouvé pour manipuler ces bdd isis donc je tatonne wink


Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO

Hors ligne

#17 Le 13/11/2008, à 16:17

thierry2351

Re : [Résolu] Extraire morceau de texte dans une variable

OK.
Ça commence à devenir un peu pénible à faire en script shell.
Tu pourrais faire ça en Python par exemple (et ça marche alors aussi bien sous Windows, en plus !) :

#! /usr/bin/python
# -*- coding: utf-8 -*-

import re

# L'expression régulière qui reconnait les blocs de données.
# On récupère les sous-groupes data et id
# re.S pour que . matche les retours à la ligne
re_bloc=re.compile(r'(?P<data>\s*-ISIS- .*?>  <ID> \((?P<id>\d+)\))',re.S)



def liste_donnees(fichier) :
       """ lit le fichier de données pour créer un tableau liste[ID]=données"""
       liste={}
       for data,id in re_bloc.findall(open(fichier).read()) :
              liste[id]=data
       return liste

def remplace_donnees(fichier,donnees) :
       
       def donnees_de_remplacement(matchobj) :
              """renvoie les données correspondant à l'id"""
              try :
                     return donnees[matchobj.groupdict()['id']]
              except :
                     print "Pas de données pour l'id" ,matchobj.groupdict()['id']
                     exit()
       texte=open(fichier).read()
       out=re_bloc.sub(donnees_de_remplacement,texte)
       return out

donnees=liste_donnees("test1")
donnees_remplacees=remplace_donnees("test2",donnees)
open("test.out","w").write(donnees_remplacees)

Hors ligne

#18 Le 13/11/2008, à 16:23

KicheTof

Re : [Résolu] Extraire morceau de texte dans une variable

pfiou j'ai pas tout compris mais je vais tester smile

les balises function et tout me parles, mais genre cette ligne me parle absolument pas : re_bloc=re.compile(r'(?P<data>\s*-ISIS- .*?>  <ID> \((?P<id>\d+)\))',re.S)

Je vais tester ça après big_smile

Merci en tout cas !


Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO

Hors ligne

#19 Le 13/11/2008, à 16:30

piark

Re : [Résolu] Extraire morceau de texte dans une variable

Je vais dire peut-être une annerie, mais quand j'ai à parser ce genre de fichiers, perso j'utilise awk (plutôt gawk).

awk te permet de spécifier les délimiteurs, après tu fais un printf de la collone dont tu as besoin.

Et c'est très rapide pour traiter un flux de lignes de fichiers plats.

ça te conviendrais ?

Hors ligne

#20 Le 13/11/2008, à 16:52

KicheTof

Re : [Résolu] Extraire morceau de texte dans une variable

Pour moi tout me va smile

Tant que j'ai pas a entrer manuellement mes 1000 produits dans la base de donnée big_smile


Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO

Hors ligne

#21 Le 13/11/2008, à 16:58

KicheTof

Re : [Résolu] Extraire morceau de texte dans une variable

KicheTof a écrit :

pfiou j'ai pas tout compris mais je vais tester smile

les balises function et tout me parles, mais genre cette ligne me parle absolument pas : re_bloc=re.compile(r'(?P<data>\s*-ISIS- .*?>  <ID> \((?P<id>\d+)\))',re.S)

Je vais tester ça après big_smile

Merci en tout cas !

Mes excuses, dans un fichier c'est l'ID et dans l'autre c'est num_cat. Ces 2 valeurs étant identiques... mais je sais pas comment modifier cette ligne

En guise de parade, j'ai remplacé ID par num_cat dans mon fichier de donnée remplacement et...


ça FONCTIONNNNNNNNNE !!!!


Un énorme merciiiiiiiiiiiiiiiiiiii !

Si t'arrive juste a trouver comment faire pour data ID num_cat et la meme plus besoin de faire un rechercher remplacer smile

Dernière modification par KicheTof (Le 13/11/2008, à 17:12)


Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO

Hors ligne

#22 Le 13/11/2008, à 17:11

aleph

Re : [Résolu] Extraire morceau de texte dans une variable

> KicheTof

> Merci aleph pour ta réponse, est-ce que tu aurai des infos complète par rapport a ce que je souhaite ?

Oui et non.

Oui dans le sens que ce ne serait pas un très gros problème pour moi de faire ce travail. Ce n'est après tout que de la manipulation de fichiers texte, même s'il s'agit d'une base de données ISIS, pdb (Protein Data Base) ou protéomique.

Non dans le sens où je n'ai pas l'envie de m'atteler à la tâche.

Mon intention n'est pas de faire ton travail ou de donner une recette miracle, mais plutôt de t'indiquer, au cas où tu ne le saurais pas, qu'il existe des outils fort sympathiques qui conviennent très bien à ce genre de job, comme par ex. Python.

Aucun prosélytisme de ma part. Python est installé par défaut sur à peu près tous les *x, sous Windows il faut l'installer. Si tu n'a pas envie de l'installer et que tu veux faire tes dents, tu peux essayer, par ex psi, http://spinecho.ze.cx/ > psi, une version portable de Python qui fonctionne sur une clef usb.

Moi aussi, j'ai utilisé bash, sh et autres outils de ce genre. Mais c'était, il y a ... vingt ans. Depuis, l'eau a coulé sous les ponts et d'autres outils ont fait leurs apparitions.

Une dernière et courte remarque. Je ne sais pas quel est ton boulot et ton cahier de charge. Dans le monde de la "molécule", beaucoup d'applications n'existent que sous Windows ou OS X et les outils multi-plateforme comme ceux mentionnés précédemment sont les bienvenus et d'ailleurs ... fort utilisés.

#23 Le 13/11/2008, à 17:18

KicheTof

Re : [Résolu] Extraire morceau de texte dans une variable

Je te comprend tout a fait et je vais m'y mettre dès que j'aurai du temps smile

Sinon je bosse dans la chimie et je dois enregistrer environ 1000 fichiers dans isis et je dois switcher entre 2 à 3 fichiers pour les enregistrer, avec ma parade, ça me faisait que 2 fichier a éditier pour compléter et mtn... le pied géant big_smile


Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO

Hors ligne

#24 Le 13/11/2008, à 17:39

KicheTof

Re : [Résolu] Extraire morceau de texte dans une variable

J'ai tenté de modifier mais j'y arrive pas.

J'explique, dans mon fichier 1 j'ai les lignes de 0 0 0  entre -ISIS et M  END et je souhaite les remplacer par le fichier 2.

La valeur qui identique aux 2 est : pour le fichier 1 : <num_cat> et pour le fichier 2 <id>

mais j'arrive pas a modifier la ligne pour que ça prenne en compte :S


Ubuntu Intrepid Ibex 64bit
Intel Core2Duo E6750 OC @ 3.52GHz - 4Gb DDR2 1066 - GeForce 7900GTO

Hors ligne

#25 Le 13/11/2008, à 20:18

thierry2351

Re : [Résolu] Extraire morceau de texte dans une variable

Salut,
la ligne en question est une expression régulière. C'est une expression qui permet de rechercher des motifs de texte.
La doc des re python est à :
http://www.python.org/doc/2.5.2/lib/re-syntax.html

C'est l'outil à connaître pour faire des recherches/remplacements dans des textes.

La solution que tu as utilisée convient : tu peux remplacer num_cat par ID en faisant :

sed -ie 's/<num_cat>/<ID>/g' test1

ou alors, tu peux le faire lors de la lecture du fichier :

def liste_donnees(fichier) :
       """ lit le fichier de données pour créer un tableau liste[ID]=données"""
       liste={}
       texte=open(fichier).read()
       texte=texte.replace("<num_cat>","<ID>")
       for data,id in re_bloc.findall(texte) :
              liste[id]=data
       return liste

De manière générale, Python est simple à apprendre et très pratique pour ce genre de petites moulinettes. Les expressions régulières, tu les retrouveras presque identiques dans la plupart des langages de haut niveau et dans les outils unix comme sed, grep....
Ça peut valoir le coup !

Hors ligne