Shell unix : Remplacement de valeurs à partir d'un fichier
Résolu
agobats
Messages postés
17
Statut
Membre
-
dna.factory Messages postés 29146 Statut Modérateur -
dna.factory Messages postés 29146 Statut Modérateur -
Bonjour,
je voudrais, à partir d'unix, procéder à un remplacement de valeurs de texte à partir d'une table de correspondance.
Je m'explique : j'ai donc une table de correspondance appelée table.txt qui contient 2 colonnes, la première contient l'ancienne valeur et la deuxième la nouvelle valeur.
A partir de cette table je veux remplacer dans un fichier file.out les anciennes valeurs par les nouvelles.
table.txt :
orange pomme
banane kiwi
fraise framboise
peche abricot
...
file.out :
peche France
orange Maroc
peche Nouvelle-Zelande
fraise Espagne
Merci beaucoup de votre aide.
je voudrais, à partir d'unix, procéder à un remplacement de valeurs de texte à partir d'une table de correspondance.
Je m'explique : j'ai donc une table de correspondance appelée table.txt qui contient 2 colonnes, la première contient l'ancienne valeur et la deuxième la nouvelle valeur.
A partir de cette table je veux remplacer dans un fichier file.out les anciennes valeurs par les nouvelles.
table.txt :
orange pomme
banane kiwi
fraise framboise
peche abricot
...
file.out :
peche France
orange Maroc
peche Nouvelle-Zelande
fraise Espagne
Merci beaucoup de votre aide.
A voir également:
- Shell unix : Remplacement de valeurs à partir d'un fichier
- Classic shell - Télécharger - Personnalisation
- Fichier executable unix ✓ - Forum MacOS
- Secure shell - Télécharger - Divers Web & Internet
- Unix scrabble ✓ - Forum loisirs/vie pratique
- Shell infrastructure host c'est quoi - Guide
3 réponses
$ cat table
orange pomme
banane kiwi
fraise framboise
peche abricot
$ cat out
peche France
orange Maroc
peche Nouvelle-Zelande
fraise Espagne
$ join -1 1 -2 1 -o 1.2 2.2 <(sort table) <(sort out)
framboise Espagne
pomme Maroc
abricot France
abricot Nouvelle-Zelande
Bonjour,
Avec la commande nawk ça ne passe pas j'ai le message suivant :
nawk : syntax error at source line
context is '/[(]/ {t[$1]=$2; next} >>> /= <<<
nawk: bailing out at source line 1
Avec les commande sed, j'ai le message :
Cannont open pathern-file
Désolé pour le dérangement. Ne serait-il pas possible de passer par une commande plus simple du genre :
on déclare les 2 valeurs, puis dans une boucle on insére la commande suivante :
sed 's/$val1/$val2/g' <file.input >file.out
Salutations.
Avec la commande nawk ça ne passe pas j'ai le message suivant :
nawk : syntax error at source line
context is '/[(]/ {t[$1]=$2; next} >>> /= <<<
nawk: bailing out at source line 1
Avec les commande sed, j'ai le message :
Cannont open pathern-file
Désolé pour le dérangement. Ne serait-il pas possible de passer par une commande plus simple du genre :
on déclare les 2 valeurs, puis dans une boucle on insére la commande suivante :
sed 's/$val1/$val2/g' <file.input >file.out
Salutations.
sur la cammande awk, j'ai le message suivant :
ksh: syntax error: '(' unexpected
Pour la commande sed c'est nettement mieux sauf que le fichier n'est pas mis à jour. J'ai aussi supprimé le $, car avec rien se se passait. Par contre je voudrais que le fichier soit sauvegardé et pas seulement affcihé.
Merci pour tout
ksh: syntax error: '(' unexpected
Pour la commande sed c'est nettement mieux sauf que le fichier n'est pas mis à jour. J'ai aussi supprimé le $, car avec rien se se passait. Par contre je voudrais que le fichier soit sauvegardé et pas seulement affcihé.
Merci pour tout
Pour la commande sed c'est nettement mieux sauf que le fichier n'est pas mis à jour complétement.Pas complètement n'est pas une réponse pouvant nous mettre sur la voie ;-(
Peux-tu développer s'il te plaît ?
J'ai supprimé le $, car avec rien se se passaitT'es sûr ? ;-\
Le caractère $ représente la fin de ligne et rien d'autre.
Par contre je voudrais que le fichier soit sauvegardé et pas seulement affcihé.Suffit de faire une redirection
sed -f cmd.sed fichier > fich.final
De plus je ne dois surtout pas trier les données
Désolé de ne pas avoir été suffisamment précis dans mon exemple. J'aurai dû te joindre les fichiers mais comme je ne les avais pas avec moi.
Ceci dit la commande join pourra me servir pour une autre application.
Salutations.
Cette-fois-ci je joins un extrait des fichiers. Après vérification, je me suis trompé sur la position du texte à remplacer. Le fichier a toujours ce format et la valeur a changer est toujours au même endroit (avant-denier caractère) et n'apparaît qu'une fois par ligne. Je ne trouve pas la solution, je pensais qu'avec une commande sed et éventuellement un cut ça serait possible, mais comme je suis un peu néophyte sur les boucles.
Fichier d'entrée :
K 1000. 1000.
9 2880. 3040.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='3'
9 2880. 3040.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='3'
9 2255. 3040.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='5'
9 4460. 3040.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='3'
9 3200. 3040.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='3'
9 3040. 2925.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='5'
9 3040. 2270.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='5'
9 3040. 2630.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='5'
9 3040. 2780.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='3'
9 3040. 1440.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='3'
9 3210. 1380.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='5'
9 4460. 1380.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='1'
Table :
1 (A12)
2 (A13)
3 (A15)
4 (A16)
5 (A17)
Fichier résultat :
K 1000. 1000.
9 2880. 3040.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='(A15)'
9 2880. 3040.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='(A15)'
9 2255. 3040.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='(A17)'
9 4460. 3040.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='(A15)'
9 3200. 3040.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='(A15)'
9 3040. 2925.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='(A17)'
9 3040. 2270.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='(A17)'
9 3040. 2630.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='(A17)'
9 3040. 2780.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='(A15)'
9 3040. 1440.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='(A15)'
9 3210. 1380.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='(A17)'
9 4460. 1380.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='(A12)'
Merci pour votre aide.
$ awk -F "[ ']" '/[(]/ {t[$1]=$2; next} /=/ {$5=t[$5] "'\''"; sub("= ", "='\''")} {print}' table fichier
K 1000. 1000.
9 2880. 3040.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='(A15)'
9 2880. 3040.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='(A15)'
9 2255. 3040.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='(A17)'
9 4460. 3040.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='(A15)'
9 3200. 3040.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='(A15)'
9 3040. 2925.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='(A17)'
9 3040. 2270.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='(A17)'
9 3040. 2630.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='(A17)'
9 3040. 2780.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='(A15)'
9 3040. 1440.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='(A15)'
9 3210. 1380.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='(A17)'
9 4460. 1380.
ATTRIBUT CHANGE NAME=MATERIAL VALUE='(A12)'
awk c'est quand même puissant ;-))
Bon je mets quand même ma solution (bash + sed) ;-))