Script shell - aidez une pauvre débutante
ZazNet
-
ZazNet -
ZazNet -
Bonjour,
On m'a demandé de faire un script shell alors que ca fait plus de 5 ans que je n'ai plus fait de DEV.
Je vais un peu dans tous les sens. Pouvez vous au moins me mettre dans le droit chemin ?
Contexte : un fichier A contient une liste de paramètre du style :
Ligne 1 : param1;10-4-4;lbellé x
Ligne 2 : param2;15-8-4;lbellé y
etc...
Un fichier B (que je mettrai en entrée du script) contient des données (y compris les params indiqués dans le fichier précédent. Le moyen de retrouver leur emplacement vient des positions indiqués dans le fichier A.
Je m'explique, le fichier B est du type :
Ligne 1 : 10 VAL1 VAL2 VAL3
Ligne 2 : 15 VAL5 VAL6 VAL7
[D'après le fichier A, pour une ligne commencant par 10, je vais en position 4 sur 4 caractères, donc param1=VAL2.
Idem pour une ligne commencant par 15, je vais en position 8 sur 4 caractères, donc param2=VAL6]
Mon script doit parser le fichier A à la recherche de toutes les positions demandées. Je pensais les mettre dans un tableau. Le tableau contiendra dans mon exemple : 10-4-4; 15-8-4
Ensuite, pour chaque paramètre, vérifier sa position dans le fichier B et mettre les valeurs trouvées dans un fichier de type CSV.
Le script doit être lancé de la façon suivante :
script.ksh fichierB
Pouvez vous m'indiquer comment lire les fichiers fournis et comment mettre ses valeurs dans un tableau ?
Comment récuperer les valeurs entre 2 ";"
MERCI pour votre aide !!
Je suis complètement perdue.
On m'a demandé de faire un script shell alors que ca fait plus de 5 ans que je n'ai plus fait de DEV.
Je vais un peu dans tous les sens. Pouvez vous au moins me mettre dans le droit chemin ?
Contexte : un fichier A contient une liste de paramètre du style :
Ligne 1 : param1;10-4-4;lbellé x
Ligne 2 : param2;15-8-4;lbellé y
etc...
Un fichier B (que je mettrai en entrée du script) contient des données (y compris les params indiqués dans le fichier précédent. Le moyen de retrouver leur emplacement vient des positions indiqués dans le fichier A.
Je m'explique, le fichier B est du type :
Ligne 1 : 10 VAL1 VAL2 VAL3
Ligne 2 : 15 VAL5 VAL6 VAL7
[D'après le fichier A, pour une ligne commencant par 10, je vais en position 4 sur 4 caractères, donc param1=VAL2.
Idem pour une ligne commencant par 15, je vais en position 8 sur 4 caractères, donc param2=VAL6]
Mon script doit parser le fichier A à la recherche de toutes les positions demandées. Je pensais les mettre dans un tableau. Le tableau contiendra dans mon exemple : 10-4-4; 15-8-4
Ensuite, pour chaque paramètre, vérifier sa position dans le fichier B et mettre les valeurs trouvées dans un fichier de type CSV.
Le script doit être lancé de la façon suivante :
script.ksh fichierB
Pouvez vous m'indiquer comment lire les fichiers fournis et comment mettre ses valeurs dans un tableau ?
Comment récuperer les valeurs entre 2 ";"
MERCI pour votre aide !!
Je suis complètement perdue.
A voir également:
- Script shell - aidez une pauvre débutante
- Classic shell - Télécharger - Personnalisation
- Script vidéo youtube - Guide
- Mas script - Accueil - Windows
- Ghost script - Télécharger - Polices de caractères
- Script cmd - Guide
5 réponses
Coucou,
c'est compliqué ton truc mais tu a surement une bonne raison de vouloir faire comme cela ;)
je connais peu le script shell (bash), plutot pour faire des trucs simple, je sais pas comment lire un fichier, etc..
je sais pas si on peut le faire ainsi, et je pense qu'il vaut mieux passer par des scripts perl (la syntaxe est chiante mais c'est très puissant), et pour ca par contre je peut t'aider.
sinon, en shell, je sais qu'il y a la commande "cut" pour séparer des chaines avec un délimiteur,
quelqu'un d'autre serait faire ca en shell ?
bon courage :)
c'est compliqué ton truc mais tu a surement une bonne raison de vouloir faire comme cela ;)
je connais peu le script shell (bash), plutot pour faire des trucs simple, je sais pas comment lire un fichier, etc..
je sais pas si on peut le faire ainsi, et je pense qu'il vaut mieux passer par des scripts perl (la syntaxe est chiante mais c'est très puissant), et pour ca par contre je peut t'aider.
sinon, en shell, je sais qu'il y a la commande "cut" pour séparer des chaines avec un délimiteur,
quelqu'un d'autre serait faire ca en shell ?
bon courage :)
Salut,
t'es sûre que tu veux ça?
d'après ton explication le 2ème paramètre ne devrait être plutôt VAL7 ?!
voici un exemple
t'es sûre que tu veux ça?
d'après ton explication le 2ème paramètre ne devrait être plutôt VAL7 ?!
voici un exemple
$ cat a.txt param1;10-4-4;lbellé x param2;15-8-4;lbellé y $ cat b.txt 10 VAL1 VAL2 VAL3 15 VAL5 VAL6 VAL7 $ for i in $(cat a.txt|cut -d';' -f2);do echo -e "$i \c";grep "${i%%-*}" b.txt|cut -d' ' -f3;done 10-4-4 VAL2 15-8-4 VAL6
J'ai fait un truc en bash (je pense que ca devrait marcher en "ksh")
ca lit le 1er fichier dans un tableau, puis ensuite le 2eme fichier en parcourant le tableau a chaque ligne,
j'espère que ca t'aidera !
je peut difficilement aller plus loin en bash, je ne connait pas grand chose.
ca lit le 1er fichier dans un tableau, puis ensuite le 2eme fichier en parcourant le tableau a chaque ligne,
j'espère que ca t'aidera !
je peut difficilement aller plus loin en bash, je ne connait pas grand chose.
#!/bin/bash fichier1="fic1.txt" fichier2="fic2.txt" # boucle sur le fichier "fic1.txt", et on construit le tableau "TAB" # en ne prennant que le champ qui nous interesse declare -a TAB index=0 while IFS=";" read -r param value libelle do # pour chaque ligne on a les champs $param $value et $libelle, # séparés par ";" TAB[index]="$value" let "index+= 1" done < $fichier1 echo "total des ligne du tableau : ${#TAB[@]}" # boucle sur le fichier "fic2.txt", cette fois on sépare avec les espaces while IFS=" " read -r idligne param1 param2 param3 do # pour chaque ligne on a les champs $idligne, $param1, etc.. # et on parcourt le tableau précédemment créé index=0 total=${#TAB[@]} while [ $index -lt $total ] do value=${TAB[index]} let "index = $index + 1" champ1=`echo $value | cut -d"-" -f1` champ2=`echo $value | cut -d"-" -f2` champ3=`echo $value | cut -d"-" -f3` # dans champ1,champ2 et champ3 on a les 3 champs du tableau # maintenant il faut comparer, etc.. echo "tableau = $champ1 / $champ2 / $champ3 ($value)" done done < $fichier2
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Oui j'ai une bonne raison.... :(
Enfin pour répondre à vos questions :
- je dois effectivement utiliser le awk mais comme le reste je n'y connais rien.
- le 2eme paramètre trouvé est bien VAL6. En fait il faut partir du debut de la ligne, compter 8 caractères.
pour : 15 VAL5 VAL6 VAL7 on arrive au début de VAL6.
Je vais essayer de voir avec vos codes si je m'en sors !
En tout cas merci beaucoup pour voitre aide.
Si vous avez d'autres idées, allez y, je suis preneuse !
Enfin pour répondre à vos questions :
- je dois effectivement utiliser le awk mais comme le reste je n'y connais rien.
- le 2eme paramètre trouvé est bien VAL6. En fait il faut partir du debut de la ligne, compter 8 caractères.
pour : 15 VAL5 VAL6 VAL7 on arrive au début de VAL6.
Je vais essayer de voir avec vos codes si je m'en sors !
En tout cas merci beaucoup pour voitre aide.
Si vous avez d'autres idées, allez y, je suis preneuse !