Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Programmation sioux en ksh (tableaux)

4 réponses
Avatar
mulan
Bonjour,

Encore moi, je suis débordée et je n'ai pas trop le temps de me pencher sur
les questions de gestion de tableaux. Et galère pour trouver sur le net...

Voici ce que je voudrais faire:


1) Simulation grossière de tableaux à 2 dimensions

J'ai une série de listes:

tab1="data data .... data"
tab2="data data .... data"
...
tabn="data data .... data"

Je voudrais accéder à tabi en mettant i dans une variable. Je sais que c'est
possible car j'ai déjà fait quelque chose de similaire... il y a longtemps !
La difficulté supplémentaire est que i doit pouvoir être une chaîne de
caractères (les variables correspondant aux différentes valeurs de i sont
définies par ailleurs) car je ne peux pas gérer des nombres.


2) Accès à un élément de tableau

tab="elt1 elt2 ..."

Y-a-t'il un moyen plus fin qu'une boucle sur i pour savoir si un élément elt
appartient à tab ? Je pensais utiliser des choses comme expr ou
${tab:pattern_elt}, mais là je ne maîtrise pas assez.


3) Supprimer un élément d'un tableau sans s'arracher les cheveux sur la
gestion des tableaux:

J'ai tab1="a b c d e" # tous les éléments que peut contenir tab1

J'ai un autre tableau qui contient un sous-ensemble des éléments de tab1:
par exemple tab2="a c"

J'ai besoin de constituer tab3 qui ne contiendra que les éléments de tab2 se
trouvant aussi dans tab1 sachant que ce dernier peut-être modifié à la
demande. Exemple:

tab1="a b e" # on a provisoirement réduit le contenu de tab1 pour des tests
tab2="a c"

Résultat attendu:
tab3="a"


Toute aide est la bienvenue, merci d'avance !

4 réponses

Avatar
Stephane CHAZELAS
2010-12-21, 19:25(+01), mulan:
Bonjour,

Encore moi, je suis débordée et je n'ai pas trop le temps de me pencher sur
les questions de gestion de tableaux. Et galère pour trouver sur le net...

Voici ce que je voudrais faire:


1) Simulation grossière de tableaux à 2 dimensions

J'ai une série de listes:

tab1="data data .... data"
tab2="data data .... data"
...
tabn="data data .... data"

Je voudrais accéder à tabi en mettant i dans une variable. Je sais que c'est
possible car j'ai déjà fait quelque chose de similaire... il y a longtemps !
La difficulté supplémentaire est que i doit pouvoir être une chaîne de
caractères (les variables correspondant aux différentes valeurs de i sont
définies par ailleurs) car je ne peux pas gérer des nombres.




i=1
eval "tab=$tab$i"

2) Accès à un élément de tableau

tab="elt1 elt2 ..."

Y-a-t'il un moyen plus fin qu'une boucle sur i pour savoir si un élément elt
appartient à tab ? Je pensais utiliser des choses comme expr ou
${tab:pattern_elt}, mais là je ne maîtrise pas assez.




case " $tab " in
(*" $elt "*) echo in;;
esac

3) Supprimer un élément d'un tableau sans s'arracher les cheveux sur la
gestion des tableaux:

J'ai tab1="a b c d e" # tous les éléments que peut contenir tab1

J'ai un autre tableau qui contient un sous-ensemble des éléments de tab1:
par exemple tab2="a c"

J'ai besoin de constituer tab3 qui ne contiendra que les éléments de tab2 se
trouvant aussi dans tab1 sachant que ce dernier peut-être modifié à la
demande. Exemple:

tab1="a b e" # on a provisoirement réduit le contenu de tab1 pour des tests
tab2="a c"

Résultat attendu:
tab3="a"



tab3=$(
tr ' ' 'n' << E | sort | uniq -d | paste -sd ' ' -
$tab1
$tab2
E
)

Encore une fois, utiliser des variables, des boucles ou des
fonctions en shell est un signe qu'on n'utilise pas le bon
outil, ou au moins la bonne methode.

Meme avec un shell script, tu dois pouvoir le repenser a mon
avis en utilisant des schemas propices a awk.

--
Stephane
Avatar
mulan
"Stephane CHAZELAS" a écrit dans le message de
news:
2010-12-21, 19:25(+01), mulan:
Bonjour,

Encore moi, je suis débordée et je n'ai pas trop le temps de me pencher
sur
les questions de gestion de tableaux. Et galère pour trouver sur le
net...

Voici ce que je voudrais faire:


1) Simulation grossière de tableaux à 2 dimensions

J'ai une série de listes:

tab1="data data .... data"
tab2="data data .... data"
...
tabn="data data .... data"

Je voudrais accéder à tabi en mettant i dans une variable. Je sais que
c'est
possible car j'ai déjà fait quelque chose de similaire... il y a
longtemps !
La difficulté supplémentaire est que i doit pouvoir être une chaîne de
caractères (les variables correspondant aux différentes valeurs de i sont
définies par ailleurs) car je ne peux pas gérer des nombres.




i=1
eval "tab=$tab$i"

2) Accès à un élément de tableau

tab="elt1 elt2 ..."

Y-a-t'il un moyen plus fin qu'une boucle sur i pour savoir si un élément
elt
appartient à tab ? Je pensais utiliser des choses comme expr ou
${tab:pattern_elt}, mais là je ne maîtrise pas assez.




case " $tab " in
(*" $elt "*) echo in;;
esac

3) Supprimer un élément d'un tableau sans s'arracher les cheveux sur la
gestion des tableaux:

J'ai tab1="a b c d e" # tous les éléments que peut contenir tab1

J'ai un autre tableau qui contient un sous-ensemble des éléments de tab1:
par exemple tab2="a c"

J'ai besoin de constituer tab3 qui ne contiendra que les éléments de tab2
se
trouvant aussi dans tab1 sachant que ce dernier peut-être modifié à la
demande. Exemple:

tab1="a b e" # on a provisoirement réduit le contenu de tab1 pour des
tests
tab2="a c"

Résultat attendu:
tab3="a"



tab3=$(
tr ' ' 'n' << E | sort | uniq -d | paste -sd ' ' -
$tab1
$tab2
E
)



Merci beaucoup. Je suis sciée devant tant de science (jeu de mot stupide :)

J'ai beau m'y connaitre relativement bien en shell, je suis encore loin de
posséder cette maîtrise de tout ce qu'on peut mettre entre $( et ), de même
qu'entre ${ et }. Mais il n'existe pas de tutoriel sur le net qui
expliquerait bien tout ça car les exemples sont rarissimes (Appel du pied:
existerait-il un tutoriel sur le net qui expliquerait bien tout ça ???).

Pour la 2), y aurait'il d'autres possibilités qu'en passant par un case car
j'ai voulu en utiliser un aujourd'hui même et j'ai eu un effet de bord qui
m'a fait repasser à du if then else. Cela m'est déjà arrivé: sur chaque cas
je me contente d'affecter une variable. A la sortie, la variable est vide.
Si je rajoute un print "n'importe quoi" à la suite de l'affectation (donc
avant le ;; de fin), la variable contient la bonne valeur. Si vous avez une
explication je suis preneuse.


Encore une fois, utiliser des variables, des boucles ou des
fonctions en shell est un signe qu'on n'utilise pas le bon
outil, ou au moins la bonne methode.



Oui oui je sais, mais là l'utilisation du shell est imposée. Pour ce qui est
de la méthode... J'ai une problématique du style 4 cas x 20 élements
complexes à traiter, alors à un moment il faut bien se résoudre à passer par
des boucles... Et je préfère éviter la création de fichiers intermédiaires.


Meme avec un shell script, tu dois pouvoir le repenser a mon
avis en utilisant des schemas propices a awk.



Mmmoui awk j'utilise surtout quand j'ai des fichiers à dépiauter :-/ parce
que c'est quand même assez lourd. Et puis c'est pas évident de récupérer du
paramétrage en sortie quand on attend plusieurs choses à la fois. A moins
que vous n'ayiez la formule magique pour balancer le flux des résultats
produits par awk direct dans un tableau :-)
Avatar
talon
mulan wrote:
qu'entre ${ et }. Mais il n'existe pas de tutoriel sur le net qui
expliquerait bien tout ?a car les exemples sont rarissimes (Appel du pied:
existerait-il un tutoriel sur le net qui expliquerait bien tout ?a ???).




Il y a un tutoriel sur le net qui explique pas mal de choses pour sh et
awk:
http://www.grymoire.com/Unix/Sh.html
http://www.grymoire.com/Unix/Awk.html
Sans être un puits de science (bien loin de là) j'ai trouvé que awk
était extrêmement puissant et permettait de se passer de perl dans tous
les cas où un langage plus puissant et plus clair n'est pas requis.
Pour moi les tutos de grymoire ont été nécessaires et suffisants (
à compléter par les pages man).

--

Michel TALON
Avatar
mulan
"Michel Talon" a écrit dans le message de news:
iesgi3$o2e$
mulan wrote:
qu'entre ${ et }. Mais il n'existe pas de tutoriel sur le net qui
expliquerait bien tout ?a car les exemples sont rarissimes (Appel du
pied:
existerait-il un tutoriel sur le net qui expliquerait bien tout ?a ???).




Il y a un tutoriel sur le net qui explique pas mal de choses pour sh et
awk:
http://www.grymoire.com/Unix/Sh.html
http://www.grymoire.com/Unix/Awk.html



Sympa le site, merci.

Sans être un puits de science (bien loin de là) j'ai trouvé que awk
était extrêmement puissant et permettait de se passer de perl dans tous
les cas où un langage plus puissant et plus clair n'est pas requis.



C'est pareil pour sh alors, parce que les tableaux à 2 dimensions ça me
manque grave ainsi que les tables de hashing :)

Pour moi les tutos de grymoire ont été nécessaires et suffisants (
à compléter par les pages man).

--

Michel TALON