Script shell - aidez une pauvre débutante

Fermé
ZazNet - 29 avril 2008 à 21:49
 ZazNet - 30 avril 2008 à 10:51
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.
A voir également:

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 :)
0
LtSoldier Messages postés 23 Date d'inscription mardi 29 avril 2008 Statut Membre Dernière intervention 25 juillet 2008 2
29 avril 2008 à 22:54
Bonjour,

A tu penser à la commande "awk" ?
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
29 avril 2008 à 22:59
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
$ 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
0
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.

#!/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

0

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 !
0