Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 16/06/2012, à 13:43

valoum

[Résolu] Problème remplissage tableau/ Boucle while

Bonjour à tous,

J'ai un problème qui me prend la tête depuis un moment. J'ai essayé toutes les combinaisons de syntaxe que je connais mais je n'arrive pas à régler le problème.
Je veux extraire les champs d'un fichier texte (en fait les différents champs de chaque ligne) et je le fais avec une boucle while mais les champs ne sont pas stockés dans les tableaux.
Je vous mets la syntaxe que j'utilise :

i=1
declare -a tab
declare -a tab1

while read ligne
do
echo $ligne > fichier.txt
tab(i)=$(cut -d" " -f1 fichier.txt)
tab1(i)=$(cut -d" " -f2 fichier.txt)
(( i = i+1 ))
done < fichier_à_traiter.txt

Je ne comprends pas pourquoi les résultats de mes cut ne se stockent pas...
NB : Pour tab(i) j'utilise des [ à la place des () mais apparemment je ne peux pas poster ce message en utilisant les crochets.

Merci d'avance pour votre aide

Dernière modification par valoum (Le 21/06/2012, à 07:49)

Hors ligne

#2 Le 16/06/2012, à 14:25

pingouinux

Re : [Résolu] Problème remplissage tableau/ Boucle while

Bonjour,

Le programme n'est pas très propre, mais il marche, et stocke les 2 premiers champs de chaque ligne dans les tableaux :

$ cat fichier_à_traiter.txt 
aaa  bbb  ccc  ddd eee
AAA  BBB  CCC  DDD EEE
ggg  hhh  iii  jjj kkk
GGG  HHH  III  JJJ KKK
$ cat x.sh
#!/bin/bash
i=1
declare -a tab
declare -a tab1

while read ligne
do
echo $ligne > fichier.txt
tab[i]=$(cut -d" " -f1 fichier.txt)
tab1[i]=$(cut -d" " -f2 fichier.txt)
(( i = i+1 ))
done < fichier_à_traiter.txt

echo tab="${tab[@]}"
echo tab1="${tab1[@]}"
$ ./x.sh
tab=aaa AAA ggg GGG
tab1=bbb BBB hhh HHH

Pour faire apparaître les [ i ], utiliser les balises-codes, sinon il confond avec la mise en italique.

tab[i]

Hors ligne

#3 Le 16/06/2012, à 14:26

Tawal

Re : [Résolu] Problème remplissage tableau/ Boucle while

Plop,

change tes lignes :

tab(i)=$(cut -d" " -f1 fichier.txt)
tab1(i)=$(cut -d" " -f2 fichier.txt)

par

tab(i)=$(cut -d " " -f1 fichier.txt)
tab1(i)=$(cut -d " " -f2 fichier.txt)

PS : pour pouvoir afficher les [ et ], utilise la balise "code". Cela rend plus lisible le post wink

Edit : tu peux aussi utiliser cette syntaxe :

tab(i)=`cut -d " " -f1 fichier.txt`
tab1(i)=`cut -d " " -f2 fichier.txt`

Les ` se font avec AltGr+7 (pas le 7 du pavé numérique wink).

Dernière modification par Tawal (Le 16/06/2012, à 14:29)


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#4 Le 16/06/2012, à 14:43

valoum

Re : [Résolu] Problème remplissage tableau/ Boucle while

Merci beaucoup pour vos réponses. Je vais tester tout ça...

J'ai une autre question à laquelle je ne trouve pas de réponse dans mes cours ni sur ceux sur internet.

En fait je veux traiter certaines lignes qui commencent par un point : "."
pour cela il faut que je mette une boucle if mais je n'arrive pas à trouver la bonne syntaxe pour la condition.

J'ai essayé avec :
if [ $ligne -eq /^\./ ]
if [ $ligne = /^\./ ]
if [ $ligne ~ /^\./ ]

mais aucune ne marche...

Hors ligne

#5 Le 16/06/2012, à 14:56

credenhill

Re : [Résolu] Problème remplissage tableau/ Boucle while

hello
sans boucle while:

$ cat fichier
aaa bbb ccc ddd eee
AAA BBB CCC DDD EEE
ggg hhh iii jjj kkk
GGG HHH III JJJ KKK
$ 
$ tab=($(cut -d " " -f 1 fichier))
$ tab1=($(cut -d " " -f 2 fichier))
$ 
$ echo ${#tab[@]} ${tab[@]}
4 aaa AAA ggg GGG
$ echo ${#tab1[@]} ${tab[@]}
4 aaa AAA ggg GGG
$ 

Hors ligne

#6 Le 16/06/2012, à 14:57

dev/random

Re : [Résolu] Problème remplissage tableau/ Boucle while

mg.. pas besoin de tout ces cut:

while read ligne; do
    set -- $ligne
    tab[i]=$1
    tab1[i]=$2
    point=${ligne:0:1}
    if [ "$point" = "." ]; then
        # traitement supplémentaire
    fi
done < fichier

667, the neighbour of the beast..

Hors ligne

#7 Le 16/06/2012, à 15:01

valoum

Re : [Résolu] Problème remplissage tableau/ Boucle while

C'est vrai que c'est quand même plus joli sans boucle while. Mais bon je débute en bash...

Hors ligne

#8 Le 16/06/2012, à 16:03

pingouinux

Re : [Résolu] Problème remplissage tableau/ Boucle while

Autre solution, avec awk :

tab=( $(awk '{print $1}' fichier_à_traiter.txt) )
tab1=( $(awk '{print $2}' fichier_à_traiter.txt) )
echo tab="${tab[@]}"
echo tab1="${tab1[@]}"

Hors ligne

#9 Le 16/06/2012, à 16:18

valoum

Re : [Résolu] Problème remplissage tableau/ Boucle while

Merci pour toutes ces suggestions.
Quelqu'un aurait-il une solution pour la syntaxe de la condition du if que j'ai écrit plus haut?

Merci

Hors ligne

#10 Le 16/06/2012, à 16:27

pingouinux

Re : [Résolu] Problème remplissage tableau/ Boucle while

valoum #9 a écrit :

Quelqu'un aurait-il une solution pour la syntaxe de la condition du if que j'ai écrit plus haut?

dev/random #6 te l'a donnée.

Hors ligne

#11 Le 16/06/2012, à 16:40

valoum

Re : [Résolu] Problème remplissage tableau/ Boucle while

Ok mais en fait je veux utiliser cette boucle if dans une toute autre fonction.
En fait j'ai un fichier dans lequel il y a 2 types de lignes :
- certaines contiennent une (ou plusieurs) chaines de caractères mais la première chaine commence obligatoirement par un .
- certaines contiennent plusieurs chaines de caractères et ne commencent pas par un .
Je veux appliquer un traitement diff"rent à ces deux types de lignes, c'est pourquoi j'utilise deux boucles if dont une avec la condition précitée.
Je ne peux pas utiliser la commande set dans mon cas (si la ligne ne contient qu'une seule chaine commencant par . notamment)
Et je ne comprends pas trop le role de la ligne     point=${ligne:0:1}

Hors ligne

#12 Le 16/06/2012, à 16:52

Tawal

Re : [Résolu] Problème remplissage tableau/ Boucle while

Re,

point=${ligne:0:1}

Cela veut dire que la variable point reçoit 1 caractère de la variable ligne à partir du caractère 0.
Donc en clair, point reçoit le premier caractère de la chaîne contenue dans ligne.

Dernière modification par Tawal (Le 16/06/2012, à 16:54)


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#13 Le 16/06/2012, à 17:03

valoum

Re : [Résolu] Problème remplissage tableau/ Boucle while

Tawal a écrit :

Re,

point=${ligne:0:1}

Cela veut dire que la variable point reçoit 1 caractère de la variable ligne à partir du caractère 0.
Donc en clair, point reçoit le premier caractère de la chaîne contenue dans ligne.


Ok c'est plus clair.
Est ce qu'il faut d'abord utiliser set pour pouvoir écrire cette ligne ensuite?

Hors ligne

#14 Le 16/06/2012, à 17:12

pingouinux

Re : [Résolu] Problème remplissage tableau/ Boucle while

valoum #13 a écrit :

Est ce qu'il faut d'abord utiliser set pour pouvoir écrire cette ligne ensuite?

???
La commande set -- $ligne va placer les champs de la variable $ligne dans les paramètres positionnels $1 $2…
Pour obtenir la ligne sans le . initial (marche aussi s'il n'y a pas de point) :

ligne="${ligne#.}"

Hors ligne

#15 Le 16/06/2012, à 17:22

valoum

Re : [Résolu] Problème remplissage tableau/ Boucle while

En fait j'aimerais savoir si j'écris directement point=${ligne:0:1} dans un script est ce que cette ligne donnera le résultat décrit précédemment ou bien il faut l'utiliser dans le cadre de la commande set?

Hors ligne

#16 Le 16/06/2012, à 17:29

pingouinux

Re : [Résolu] Problème remplissage tableau/ Boucle while

Je ne comprends pas la question. Le mieux est que tu donnes un exemple de ce que tu veux faire.

point=${ligne:0:1}

Dans tous les cas, cette commande ne modifie pas $ligne, et $point va contenir le premier caractère de $ligne.

Hors ligne

#17 Le 16/06/2012, à 18:42

nesthib

Re : [Résolu] Problème remplissage tableau/ Boucle while

@valoum : commence par faire un effort et utilise les balises [ code ] pour écrire ton code (cela fait plusieurs fois que l'on te fait la remarque), tu pourras sans problème utiliser la notation :

tab[i]
valoum a écrit :

il faut que je mette une boucle if

la structure if n'est pas une boucle mais une structure de test, attention de bien faire la différence entre les deux, c'est capital en programmation.

pour tester si un motif (abc) est présent en début de chaîne ($chaine) tu peux utiliser la syntaxe suivante :

[[ $chaine =~ ^abc ]]

comme le dit pingouinux tu devrait fournir un exemple précis de ce que tu cherches à faire, cela permettra de te proposer la solution la plus adaptée.

Un exemple.
soit le fichier f :

A0 B0 C0 D0
A1 B1 C1 D1
A2 B2 C2 D2
A3 B3 C3 D3
A4 B4 C4 D4

le code suivant crée 4 tableaux et assigne la valeur de la colonne correspondante :

tabA=() ; tabB=() ; tabC=() ; tabD=()
while read a b c d e
do
  tabA+=($a); tabB+=($b); tabC+=($c) ; tabD+=($d)
done < f
echo ${tabA[*]} ; echo ${tabB[*]} ; echo ${tabC[*]} ; echo ${tabD[*]}

Bien entendu, ce morceau de code n'a, en soi, pas beaucoup de sens. Il y a fort à parier que selon ce que tu veux faire il y ait une meilleure solution à proposer


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#18 Le 16/06/2012, à 19:15

valoum

Re : [Résolu] Problème remplissage tableau/ Boucle while

nesthib a écrit :

@valoum : commence par faire un effort et utilise les balises [ code ] pour écrire ton code (cela fait plusieurs fois que l'on te fait la remarque), tu pourras sans problème utiliser la notation :

tab[i]

Ok j'y penserai la prochaine fois.

Merci à tous pour vos réponses. Je pense être arrivé à ce que je voulais grâce à votre aide. Il me reste un peu de travail pour arranger tout ça mais avec vos indications ça devrait aller.

Hors ligne

#19 Le 20/06/2012, à 16:36

valoum

Re : [Résolu] Problème remplissage tableau/ Boucle while

Bonjour,

Je profite de mon sujet récent qui traite en fait d'un problème consécutif à celui pour lequel vous m'avez déjà aidé après ouverture de ce sujet.

J'ai rempli mes tableaux grâce aux boucles que vous m'avez conseillées, cela marche très bien.
Mais j'ai quelques questions :

1) Combien de temps le contenu des tableaux restent ils en mémoire?
J'ai l'impression qu'il s'effacent dès que je lance une seconde fonction après le remplissage : la seconde fonction traite le contenu des tableaux en les comparant mais on dirait que les tableaux sont tous vides.

2) Je veux comparer les contenus de mes tableaux mais il semblerait que je n'arrive pas à écrire correctement la condition :
je veux tester si le contenu numéro i de mon tableau tab1 est égal au contenu numero j du tableau tab2 ET si le contenu numero i du tableau tab3 est égal au contenu numero j du tableau tab4.
Voici ce que je rentre comme condition sur mon if :

if [ "${tab1(i)}" = "${tab2(j)}" || "${tab3(i)}" "${tab4(j)}" ]

Mais apparemment il répond toujours une réponse négative au test.

3) Je voudrais avoir le résultat de la commande diff mais je n'y arrive pas non plus.
En fait, je voudrais savoir quand deux fichiers sont différents mais ma condition ne marche pas là nom plus. Voici ce que j'écris :

if [ "$(diff fichier1 fichier2)" = " "]

Hors ligne

#20 Le 20/06/2012, à 17:05

dev/random

Re : [Résolu] Problème remplissage tableau/ Boucle while

valoum a écrit :

1) Combien de temps le contenu des tableaux restent ils en mémoire?

Tant que dure le shell ou sous-shell qui les a créés. Ca dépent de ton code..

valoum a écrit :

2) Je veux comparer les contenus de mes tableaux mais il semblerait que je n'arrive pas à écrire correctement la condition :
je veux tester si le contenu numéro i de mon tableau tab1 est égal au contenu numero j du tableau tab2 ET si le contenu numero i du tableau tab3 est égal au contenu numero j du tableau tab4.

if [ "${tab1(i)}" = "${tab2(j)}" -a "${tab3(i)}" = "${tab4(j)}" ]
valoum a écrit :

3) Je voudrais avoir le résultat de la commande diff mais je n'y arrive pas non plus.

if  ! diff -q fichier1 fichier2; then
   # les fichiers sont differents
fi

667, the neighbour of the beast..

Hors ligne

#21 Le 20/06/2012, à 17:19

pingouinux

Re : [Résolu] Problème remplissage tableau/ Boucle while

Salut,
Pour le 2), je dirais :

if [ "${tab1[$i]}" = "${tab2[$j]}" -a "${tab3[$i]}" = "${tab4[$j]}" ]

Dernière modification par pingouinux (Le 20/06/2012, à 17:20)

Hors ligne

#22 Le 20/06/2012, à 17:45

dev/random

Re : [Résolu] Problème remplissage tableau/ Boucle while

Euh, oui, pour le 2), c'est:

if [ "${tab1[i]}" = "${tab2[j]}" -a "${tab3[i]}" = "${tab4[j]}" ]

..merci, pingouinux.


667, the neighbour of the beast..

Hors ligne