Script shell assez compliqué mais pas trop

Fermé
Antiloft - 10 oct. 2012 à 23:26
dubcek Messages postés 18744 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 4 septembre 2024 - 15 oct. 2012 à 10:23
Bonjour,


Je penche depuis un moment sur un script mais je n'ai pas l'impression d'avoir la bonne manière de faire.

Il faut que je passe à un script un ou plusieurs mots séparés par des virgules, et que ce script aille chercher dans un fichier une correspondance pour chaque mot.


*Le fichier des mots est de type:
mot1 correspondance1
mot2 correspondance2
Si un mot n'est pas trouvé, il ne doit pas être modifié

Donc par exemple si je fais (je travaille par entrees-sorties c'est mieux):
echo "mot1,mot2,mot3" | monscript.sh

=> Je dois avoir comme résultat : correspondance1, correspondance2, mot3

J'étais parti sur une solution qui "splitte" chaque mot et parcours pour chaque mot le fichier mais je trouve ça un peu lourd sachant que bash dispose d'outils puissants comme sed,... pour faire cela d'un seul coup peut-etre.

Comment vous y prendriez vous ?

Merci d'avance pour vos conseils :)
A voir également:

4 réponses

Utilisateur anonyme
11 oct. 2012 à 05:44
salut,

sed n'est pas un outil bash, c'est un programme à part entière.

je travaille avec des entrées-sorties c'est mieux)
non, dans ton cas, le mieux serait de passer les mots en arguments au script.

moi, je ferais un script awk:
remplacer les virgules par une barre verticale,
tester le premier mot de la ligne contre la regex précédemment créée
etc
0
Salut,

S'il existe des méthodes toutes faites, à mon avis elles ne feront pas grand chose d différents avec ce que tu décris (isoler chaque mot et comparer).
Pour ma part pour la comparaison je ferais un test sur une commande du genre :
grep ^mot1 monfichier 

On peut améliorer en forçant la prise en compte de l'espace (de tête je sais plus comment)
0
Salut,

Effectivement sed n'est pas un outils bash, je voulais parler de bash en général avec ses programmes populaires installés par défaut comme sed. Le choix des entrées-sorties c'est pour ne pas être limité par la taille de l'argument que je passe à mon script.


Mais on peut partir sur une solution avec des arguments si c'est vraiment meilleur.
Dans ce cas je pourrais faire un for sur ${1//","/" "} pour traiter chaque mot et reconstruire ma liste modifiée au fur à mesure.

Mais comment remplacer les mots par leur correspondance dans le fichier ,uniquement s'il y a correspondance.
?
0
dubcek Messages postés 18744 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 4 septembre 2024 5 617
11 oct. 2012 à 10:15
hello
avec awk
$ cat a2
mot1 correspondance1
mot2 correspondance2
$ 
$ awk -F, 'NR==FNR{split($0, a, " *"); t[a[1]]=a[2]; next} {for(n=1; n<=NF; n++){n==NF? c="\n" :c=FS; cc=$n; if(t[$n])cc=t[$n]; printf cc c}}' a2 <(echo "mot1,mot2,mot3")
correspondance1,correspondance2,mot3
$ 
$ 
0
Merci beaucoup
N'étant pas familier avec awk c'est l'occasion, je vais décortiquer ça, ça m'a l'air bien.
0
Bonjour,
J'ai un peu de mal à comprendre ce script awk
Pourrais-tu me l'expliquer rapidement? En particulier qu'est-ce que le tableau t[] ?

Merci
0
En fait j'ai compris
Je comprenais pas car je confondais t[n] et t[$n]

En tout cas ça fait exactement ce que je souhaitais. Grand merci.
0
dubcek Messages postés 18744 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 4 septembre 2024 5 617
15 oct. 2012 à 10:23
n est le numéro du champ et $n est son contenu
0