Shell - Parcours de fichiers imbriqués

Fermé
Dipsou - Modifié par Dipsou le 11/09/2012 à 11:49
dubcek Messages postés 18719 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 4 mai 2024 - 11 sept. 2012 à 16:10
Bonjour,

Je souhaite ecrire un script qui parcoure un fichier pour en mettre un autre à jour en fonction d'un champ

Fichier PARAMETRES (ID_PARAM;CHAMP1;CHAMP2;CHAMP3) environ 5 lignes
1;A;B;B
2;C;-;G
3;B;D;E
Fichier CLIENTS (NOM;PRENOM;ID_PARAM) environ 1000 lignes
DUPONT;JACQUES;1
DURAND;PIERRE;2
MARTIN;JACQUES;3
ANDRE;GILLES;2
....

et je souhaiterais avoir la sortie suivante :
DUPONT;JACQUES;1;A;B;B
DURAND;PIERRE;2;C;-;G
MARTIN;JACQUES;3;B;D;E
ANDRE;GILLES;2;C;-;G
....

Je pensais imbriquer un awk dans un while, mais je m'y perd un peux...
Quelqu'un aurait t'il une idée ?

Merci d'avance.
______________________________________________

Désolé, j'ai trouvé la solution avec un simple join.
______________________________________________



Dipsou
A voir également:

6 réponses

dubcek Messages postés 18719 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 4 mai 2024 5 615
11 sept. 2012 à 12:13
hello
$ awk 'BEGIN{FS=OFS=";"} NR==FNR {t[$1]=$0; next} {$3=t[$3]; print }' paramètres clients
DUPONT;JACQUES;1;A;B;B
DURAND;PIERRE;2;C;-;G
MARTIN;JACQUES;3;B;D;E
ANDRE;GILLES;2;C;-;G
$ 
0
dubcek Messages postés 18719 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 4 mai 2024 5 615
11 sept. 2012 à 12:28
montre le code, ça peut servir
0
jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
Modifié par jisisv le 11/09/2012 à 16:30
La commande join est destinée à ce genre d'opération:
johand@osiris: ~/src/CCM/bash/join $ cat PARAMETRES    
1;A;B;B    
2;C;-;G    
3;B;D;E    
johand@osiris: ~/src/CCM/bash/join $ cat CLIENTS     
DUPONT;JACQUES;1    
DURAND;PIERRE;2    
MARTIN;JACQUES;3    
ANDRE;GILLES;2    
johand@osiris: ~/src/CCM/bash/join $ cat doit     
join -t ';' -1 1 -2 3  -o "2.1 2.2 1.1 1.2 1.3 1.4" PARAMETRES CLIENTS    
johand@osiris: ~/src/CCM/bash/join $ source doit     
DUPONT;JACQUES;1;A;B;B    
DURAND;PIERRE;2;C;-;G    
MARTIN;JACQUES;3;B;D;E


man join; info join

<edit> La ligne ANDRE;GILLES n'apparaît pas. Je cherche la solution </edit>
Il faut au minimum trier CLIENTS selon le champ commun:
sort -t ";" -k 3 CLIENTS > CLIENTS.sorted et travailler avec le fichier trié.

Gates gave ^H sold you the windows.
GNU gave us the whole house.(Alexandrin)
0
Merci à vous deux. Super efficace.
Apparement, ça marche avec le join.
Je n'ai pas testé si je n'ai pas d'erreurs.
Sinon, je suivrais les conseils de Jisisiv

En tout cas, je garde au chaud ta réponse dubcek.
0

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

Posez votre question
J'ai effectivement des lignes qui manquent.
En triant le fichier client, toujours le problème
En triant le fichier paramètres et le fichier client, le problème est résolu !!!!

Merci encore.
0
dubcek Messages postés 18719 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 4 mai 2024 5 615
11 sept. 2012 à 16:10
il faut trier avec join
man join
... 
Important: FILE1 and FILE2 must be sorted on the join fields.
...
0