Reperer des informations pour en changer certaines

Résolu/Fermé
th.deudon Messages postés 399 Date d'inscription mardi 2 juillet 2013 Statut Membre Dernière intervention 30 juillet 2015 - Modifié par th.deudon le 22/07/2013 à 13:51
th.deudon Messages postés 399 Date d'inscription mardi 2 juillet 2013 Statut Membre Dernière intervention 30 juillet 2015 - 30 juil. 2013 à 09:10
Bonjour,

Alors j'ai deux "problemes" a peu pres similaire,
le premier :
j'ai plusieurs ligne dans un fichier, exemple :
Blabla.aaaaaaa 1 2 3 4 5 6
Bliblibli.aAaA 1 2 3 4 5 6

j'aimerai que si mon programme voit BlaBla, il rajoute une ligne avec BleBle a la place mais ne touche pas au reste de la ligne ( sachant que le aaaaaaa peut etre composé de ce qu'on veut, dont des points )


le deuxieme :
j'ai un fichier avec des informations obsoletes, j'aimerai pouvoir les changer en fonctions des données que j'ai récuperer et mises dans un fichier :
le fichier contenant les données obsoletes :
AFEAG
ZFF
 a
 <Name = "Entity.ID.Entity" Value = ABC />
       informations a ne pas changer
    <Name= "LocalisationX " Value = X />
.....


fichier avec mes informations
ABC X Y Z ....
ABC2 X2 Y2 Z2
....


mon but : si on voit apres ""Entity.ID.Entity" Value =" une valeurs qui est en $1 du deuxieme fichier, qu'on repere les prochaines infos contenue apres "<Name= "LocalisationX " Value =" et qu'on les change par mon $2 de la ligne correspondante


je suis sur le shell
Merci :)
A voir également:

5 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
23 juil. 2013 à 10:22
Salut,

Pour ton 1er problème, ceci devrait faire l'affaire :
sed '0,/^BlaBla/ s//BleBle/' fichier


Quant au second :
$ ls
f1  f2  foo.sh

$ cat f1
AFEAG
ZFF
 a
 <Name = "Entity.ID.Entity" Value = ABC2 />
       informations a ne pas changer
    <Name= "LocalisationX " Value = X />
.....
AFEAG
ZFF
 a
 <Name = "Entity.ID.Entity" Value = ABC3 />
       informations a ne pas changer
    <Name= "LocalisationX " Value = X />
.....

$ cat f2
ABC2 X2 Y2 Z2
ABC3 X3 Y3 Z3

$ cat foo.sh 
#! /bin/bash

while read nom param reste
do
sed -i '/<Name = "Entity.ID.Entity" Value = '"${nom}"'/{n;n;s/\(Value = \)[^ ]*/\1'"${param}"'/}' f1
done < f2

$ ./foo.sh 

$ cat f1
AFEAG
ZFF
 a
 <Name = "Entity.ID.Entity" Value = ABC2 />
       informations a ne pas changer
    <Name= "LocalisationX " Value = X2 />
.....
AFEAG
ZFF
 a
 <Name = "Entity.ID.Entity" Value = ABC3 />
       informations a ne pas changer
    <Name= "LocalisationX " Value = X3 />
.....

$



1
th.deudon Messages postés 399 Date d'inscription mardi 2 juillet 2013 Statut Membre Dernière intervention 30 juillet 2015 15
Modifié par th.deudon le 23/07/2013 à 10:30
alors j'ai rien compris :))

comment je fais pour changer les parametres et le $i a mettre ? pour dire que le nom est en $1?
:)
je me suis mal exprimmé, les Y, Z etc seront utilisés apres le X ;)
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
23 juil. 2013 à 10:39
je me suis mal exprimmé,
Tout le problème est là !

Je te l'ai déjà dit :
- Exemple concret AVANT => APRÈS
- Un maximum de détails
- etc.
0
th.deudon Messages postés 399 Date d'inscription mardi 2 juillet 2013 Statut Membre Dernière intervention 30 juillet 2015 15
Modifié par th.deudon le 23/07/2013 à 11:19
Je vais essayer de te montrer.... mais c'est pas facile, j'ai pas le droit de montrer mes fichiers :/

les données inutiles : ....
fichier 1 :
........
      < PeriodicEvent>
.....
     <Field Name="Entity.ID.Entity" Value="ABC" />
    <Field Name......... Value="......" />
....
.....
    <Field Name......... Value="......" />
    <Field ....
    <Field Name= "Localisation.X " Value = "AZE" />
    <Field Name= "Localisation.Y " Value = "AvE" />
    <Field Name= "Localisation.Z " Value = "AxE" />
.......
    <Field Name= "Orientation.A" Value = "AgE" />
    <Field Name= "Orientation.B" Value = "AlE" />
    <Field Name= "Orientation.C" Value = "AmE" />
.......
  < /PeriodicEvent>
( est en autant d'exemplaire que de ligne dans le second fichier )
...........
............
( plein d'informations inutiles )


fichier 2 :
pour chaque ligne j'ai : nom X Y Z A B C ( sous cette forme )
Nom1 X1 Y1 Z1 A1 B1 C1
Nom2 X2 Y2 Z2 A2 B2 C2
ZOubi1 X3...
Zoubi2 ....
Zoubi3.....
etc


fichier voulu :
........
      < PeriodicEvent>
......
     <Field Name="Entity.ID.Entity" Value="Nom1" />
    <Field Name......... Value="......" />
....
.....
    <Field Name......... Value="......" />
    <Field ....
    <Field Name= "Localisation.X " Value = "X1" />
    <Field Name= "Localisation.Y " Value = "Y1" />
    <Field Name= "Localisation.Z " Value = "Z1" />
.......
    <Field Name= "Orientation.A" Value = "A1" />
    <Field Name= "Orientation.B" Value = "A2" />
    <Field Name= "Orientation.C" Value = "A3" />
.......
    < PeriodicEvent>
( le faire pour chaque élément comprenant <Field Name="Entity.ID.Entity" Value=" avec un nom dans mon fichier 2 ), si il existe un bloc mais avec un nom non présent, ne pas y toucher
...........
............
( plein d'informations inutiles )





EDIT : si il y n'y a pas tous les Zoubis dans le fichier 1 ( sachant qu'il y en a forcement au moins 1 ), il faudrait en créer pour que chaque Zoubi ait son bloc ( ils sont tous identiques pour les Zoubis , sauf X,Y,Z,A,B,C ) .... désolé, complication de derniere minute
le bloc commence avec < PeriodicEvent> et finit avec </ PeriodicEvent>
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
23 juil. 2013 à 11:08
Je comprend très bien que tu n'aies pas le droit de montrer des données confidentielles, mais on n'est pas devin ;-\

D'où l'importance de nous donner des exemples proches de la réalité et de bien expliquer ce que tu veux.

Là par exemple, c'est bien tu nous donnes un exemple AVANT à peu près conforme, mais APRÈS tu veux quoi ?
0
th.deudon Messages postés 399 Date d'inscription mardi 2 juillet 2013 Statut Membre Dernière intervention 30 juillet 2015 15
Modifié par th.deudon le 23/07/2013 à 11:46
j'etais en train d'edit, :p
Dubcek, lui, il est devin :)
je l'ai fait bout par bout afin de voir avec recul
ps : avec ta commande de base j'ai sed -e ( alors que j'ai mis -i mais passons .. ) underminated s command
0
th.deudon Messages postés 399 Date d'inscription mardi 2 juillet 2013 Statut Membre Dernière intervention 30 juillet 2015 15
22 juil. 2013 à 13:54
je ne sais pas si ca peut aider, mais j'ai facilement eu le premier fichier ( celui du premier probleme ) avec deux fois la ligne avec Blabla, suffit juste d'en changer 1 sur 2 en fait :)
0
th.deudon Messages postés 399 Date d'inscription mardi 2 juillet 2013 Statut Membre Dernière intervention 30 juillet 2015 15
Modifié par th.deudon le 22/07/2013 à 15:43
Ps : j'ai meme reussi a mettre le BlaBla a changer en premier.. :)
du coup faut juste changer le premier BlaBla avant le premier . du fichier en BleBle

en gros j'ai
BlaBla.fzefz ezfze zefze zef
BlaBla.fzad azf ze z ezf ze
AEZFe zefZEF ZEFZE
et je veux
BleBle.fzefz ezfze zefze zef
BlaBla.fzad azf ze z ezf ze
AEZFe zefZEF ZEFZE
0
th.deudon Messages postés 399 Date d'inscription mardi 2 juillet 2013 Statut Membre Dernière intervention 30 juillet 2015 15
23 juil. 2013 à 09:02
premier probleme résolu, j'ai split toutes les chaines et j'ai fait print "BleBle" $2 $3....

le deuxieme par contre me pose une bonne colle :/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
th.deudon Messages postés 399 Date d'inscription mardi 2 juillet 2013 Statut Membre Dernière intervention 30 juillet 2015 15
29 juil. 2013 à 14:05
Raaaah j'ai un soucis :(((((

En fait y a un deuxieme bloc nom2 tout en bas, et il faut lui changer certaines infos, au lieu de changer
    <Field Name= "Localisation.X " Value = "x4" />
    <Field Name= "Localisation.Y " Value = "y4" />
    <Field Name= "Localisation.Z " Value = "z4" />
.......
    <Field Name= "Orientation.A" Value = "a4" />
    <Field Name= "Orientation.B" Value = "b4" />
    <Field Name= "Orientation.C" Value = "c4" />

faut lui changer
    <Field Name= "Syst.Localisation.X " Value = "x4" />
    <Field Name= "Syst.Localisation.Y " Value = "y4" />
    <Field Name= "Syst.Localisation.Z " Value = "z4" />


soucis : a cause de l'ancienne ligne de code, ben il a plus de nom, j'ai
     <Field Name="Entity.ID.Entity" Value="" />

au lieu de
     <Field Name="Entity.ID.Entity" Value="Nom2" />
0
dubcek Messages postés 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
30 juil. 2013 à 08:19
avec quel code ?
0
th.deudon Messages postés 399 Date d'inscription mardi 2 juillet 2013 Statut Membre Dernière intervention 30 juillet 2015 15
30 juil. 2013 à 08:45
la ligne awk 'NR==FNR {t[++n]=$0; next} /ZOub/ {split($0, a); for(m=1; m<=n; m++){$0=t[m]; if(/Field Name/ && /Entity.ID|Localisat|Orienta/){if(/Entity/){f=1}; sub("Value[ ]*=[ ]*\"[^\"]*", "Value=" "\"" a[f++])}; print}}' fichier3 fichier2 , mais finalement je vais essayer par sub ;) j'ai eu cette idée ce matin, je test
0
th.deudon Messages postés 399 Date d'inscription mardi 2 juillet 2013 Statut Membre Dernière intervention 30 juillet 2015 15
30 juil. 2013 à 09:10
Bim bim bim, un petit SED bien placé, et une deuxieme utilisation de ta commande et hop le tour est joué :)

Merci beaucoup dubcek
0