Reperer des informations pour en changer certaines

Résolu
th.deudon Messages postés 399 Date d'inscription   Statut Membre Dernière intervention   -  
th.deudon Messages postés 399 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Contributeur Dernière intervention   6 431
 
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   Statut Membre Dernière intervention   15
 
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   Statut Contributeur Dernière intervention   6 431
 
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   Statut Membre Dernière intervention   15
 
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   Statut Contributeur Dernière intervention   6 431
 
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   Statut Membre Dernière intervention   15
 
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   Statut Membre Dernière intervention   15
 
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   Statut Membre Dernière intervention   15
 
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   Statut Membre Dernière intervention   15
 
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   Statut Membre Dernière intervention   15
 
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 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
avec quel code ?
0
th.deudon Messages postés 399 Date d'inscription   Statut Membre Dernière intervention   15
 
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   Statut Membre Dernière intervention   15
 
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