Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
variable pour boucle a partir d'un fichier texte.
Envoyé par: davidovitcz

Bonjour à tous, et bonne rentrée pour les ceux qui sont partis.

ce problème ressemble à un que j'ai déjà posté mais il y a une différence nottable :


Mon script (bash) doit récupérer deux variable dans un fichier texte pour les utiliser indépendement dans une mêm boucle. Le fichier texte est rédiger de la manière suivante : chaque ligne comprend lesd eux variables séparées par une virgule :
var1, var2
var1, var2....

je n'arrive pas à un réutiliser indépendemment les deux variables : voici ma syntaxe :

egrep -v '^(#|*$|[\s]*\n)' fichier_texte | awk -F ',' '{print $1 $2}' | while read line; do echo "$line$2" ;done

A chaque variante de ce script dans la boucle : je récupère les deux valeurs, Or je dois changer ma boucle par une plus complexe qui utilise les deux variables indépendament ... | while read line; do .....$line$1......$line$2....

merci par avance, car j'épluche le man awk depuis deux jours sans succès.

Poste le Thursday 4 September 2008 16:27:42
Répondre     Citer    
Re: variable pour boucle a partir d'un fichier texte.

/!\ Useless Use Of Awk ? awk mérite mieux. En l'occurrence, préfère `cut`... à moins de rédiger une ligne awk, qui simule et egrep et cut...
?
Utilise des tableaux !
au débotté, je dirais
a = ( egrep -v '^(#|*$|[\s]*\n)' fichier_texte | cut -d"," -f 1 )
b = ( egrep -v '^(#|*$|[\s]*\n)' fichier_texte | cut -d"," -f2 )

for ia in ${a[@]}; do qqch_avec_ia; done
for ib in ${b[@]}; do qqch_d_autre_avec_ib; done 
...
?

C'est sans doute perfectible...

Je suis pas certain d'avoir bien compris...

Poste le Thursday 4 September 2008 17:45:51
Répondre     Citer    
Re: variable pour boucle a partir d'un fichier texte.
Envoyé par: davidovitcz

Bonjour et merci,

Effectivement, le awk semble superflu, mais j'esperais le faire sans passer par un tableau.

le fait est que je dois utiliser les deux variable dans la même boucle, du type while read line; do echo "$line$1" "$line$2; done

En réalité ma boucle est plus complexe, il s'agit d'un do funct() arrgument1=$1 ...argument2=$2

du fait je ne vois pas trop comment utiliser ta syntaxe...

SI tu peux m'éclairer, merci d'avance

Poste le Friday 5 September 2008 14:13:54
Répondre     Citer    
Re: variable pour boucle a partir d'un fichier texte.

a=( egrep -v '^(#|*$|[\s]*\n)' fichier_texte | cut -d"," -f 1 )
b=( egrep -v '^(#|*$|[\s]*\n)' fichier_texte | cut -d"," -f2 )
n=$(wc -l fichier_texte) # ou ${#a[@]} si il est certain qu'il y aura toujours autant de a que de b (?)
c=0

while [ $c -le $n ]; do
funct() arg1=${a[$c]} arg2=${b[$c]}
let "c +=1"
done
J'ai raté quelquechose ?

Poste le Friday 5 September 2008 19:57:38
Répondre     Citer    
Re: variable pour boucle a partir d'un fichier texte.
Envoyé par: davidovitcz

Bonjour,

merci pour ta réponse. Effectivement, il y a toujours autant de a que de b.

Je comprend bien le début, mais pas [ $c -le $n ]. De plus, la variable c=0 semble poser problème...

To be continued

Merci, a bientot

Poste le Monday 8 September 2008 14:21:07
Répondre     Citer    
Re: variable pour boucle a partir d'un fichier texte.
Envoyé par: davidovitcz

salut, en fait apres plusieurs tests, j'ai pu faire tourner ton script, mais cela ne répond pas à ma problématique :

avec arg1=${a[$c]} tu récupere l'ensemble des enregistrement de la première colonne ( si par abut de langage on considère le premier terme de mon fichier texte comme une colonne de BDD)

Or mon besoin est de récupérer chaque enregistrement indépendamment pour ensuite pouvoir utiliser

line1-valeure1, line1-valeure2,
line2-valeure1, line2-valeure2,
line3-valeure1, line3-valeure2,

Car ce n'est pas la liste qui est utile à la fonction, mais chaque valeure...merci quand même.


Poste le Monday 8 September 2008 17:04:01
Répondre     Citer    
Re: variable pour boucle a partir d'un fichier texte.

Il faut mettre le zéro entre guillemets.
Et ce n'est pas "-le" mais "-lt", qu'il faut utiliser.

Normalement, arg1=${a[$c]} affecte la valeur de la ligne numéro $c du tableau a à arg1.

Si tu as encore des soucis, poste ton script avec un sample du fichier_texte...
?

Poste le Wednesday 10 September 2008 06:34:48
Répondre     Citer    
Re: variable pour boucle a partir d'un fichier texte.
Envoyé par: davidovitcz

Effectivement, il fallait adapté la syntaxe,

Mais finalement j'ai opté pour un cat (pas de grep, pas de hawk) :

cat mon_fichier_text | while true
do
read ligne
if [ "$ligne" = "" ]; then break; fi
table_name=`echo $ligne| cut -d "," -f 1`
table_type=`echo $ligne| cut -d "," -f 2`
ma_fonction -arg1 $table_name -f $table_name -arg2 $table_type;
done


Merci pour ton aide, A bientôt

Poste le Thursday 11 September 2008 11:55:20
Répondre     Citer    
Re: variable pour boucle a partir d'un fichier texte.

Que Beurk!!!

Je viens encore beugler au UUOC, mais cette forme accepte
[...]
done < mon_fichier_texte

La forme `commande` est obsolescente...("deprecated")

Par contre, , si tu as un peu de temps, et par gourmandise, j'accepterais volontier une explication sur le fonctionnement des fonctions avec des arguments (-arg1 [..] `commande` -arg2 `commande` ???).

Poste le Thursday 11 September 2008 13:34:10
Répondre     Citer    
Re: variable pour boucle a partir d'un fichier texte.
Envoyé par: Sve@r

Citation
davidovitcz
if [ "$ligne" = "" ]; then break; fi
[ -z "$ligne" ] && break

Citation
davidovitcz
cat mon_fichier_text | while true
do
read ligne
if [ "$ligne" = "" ]; then break; fi
table_name=`echo $ligne| cut -d "," -f 1`
table_type=`echo $ligne| cut -d "," -f 2`
ma_fonction -arg1 $table_name -f $table_name -arg2 $table_type;
done

cat mon_fichier_text | while read ligne
do
table_name=`echo $ligne| cut -d "," -f 1`
table_type=`echo $ligne| cut -d "," -f 2`
ma_fonction -arg1 $table_name -f $table_name -arg2 $table_type;
done

Ou encore mieux (car pas de pipe donc pas de sous-processus)
exec 3<mon_fichier_text
while read ligne 0<&3
do
table_name=`echo $ligne| cut -d "," -f 1`
table_type=`echo $ligne| cut -d "," -f 2`
ma_fonction -arg1 $table_name -f $table_name -arg2 $table_type;
done

L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Thursday 11 September 2008 14:54:53
Répondre     Citer    
Re: variable pour boucle a partir d'un fichier texte.

Ô, c'est beau, Sve@r !
un petit commentaire sur `exec 3<mon_fichier_text[...]`???

OK!OK! `man bash`...

Poste le Thursday 11 September 2008 15:35:02
Répondre     Citer    
Re: variable pour boucle a partir d'un fichier texte.
Envoyé par: oudoubah

Citation
&#1048;&#1074;&#1072;&#1085;
un petit commentaire sur `exec
3<mon_fichier_text[...]`???

Ca ouvre un nouveau descripteur de fichier '&3' qui correspond à mon_fichier_text
Les descripteurs de fichiers d'un processus par défaut sont au nombre de 3 :
0 pour stdin
1 pour stdout
2 pour stderr

Tu peux en ouvrir d'autres

Dans le script, tu peux faire un 'ls -l /proc/self/fd' pour voir à quoi ils correspondent.

Par contre, pourquoi ne pas faire directement (mis à part pour l'apprentissage):
while read line ; do
...
done < fichier_texte


Tu as lu les docs. Tu es devenu un informaticien. Que tu le veuilles
ou non. Lire la doc, c'est le Premier et Unique Commandement de
l'informaticien.
-+- TP in: Guide du Linuxien pervers - "L'évangile selon St Thomas"

Poste le Thursday 11 September 2008 16:30:08
Répondre     Citer    
Re: variable pour boucle a partir d'un fichier texte.
Envoyé par: oudoubah

Citation
&#1048;&#1074;&#1072;&#1085;
Ô, c'est beau, Sve@r !
un petit commentaire sur `exec
3<mon_fichier_text[...]`???

Pour compléter mon précédent post :
Tu pourras trouver de la doc ici (celle avec laquelle j'ai appris à me servir des descripteurs) :
[tldp.org]

Cela permet de lire ou d'écrire directement dans un fichier/std(in|out|err) sans avoir besoin d'effectuer à chaque fois des redirections.

Un exemple d'utilisation dans un autre contexte :
[lea-linux.org]

Enfin, un troisième contexte d'utilisation :
Ce petit script qui permet à la fois d'effectuer un traitement sur la sortie standard (avec des tubes) et de l'afficher sans passer par un fichier temporaire :

#!/bin/sh

exec 3>&1
ls | tee /proc/self/fd/3 | wc -l

Tu as lu les docs. Tu es devenu un informaticien. Que tu le veuilles
ou non. Lire la doc, c'est le Premier et Unique Commandement de
l'informaticien.
-+- TP in: Guide du Linuxien pervers - "L'évangile selon St Thomas"

Poste le Thursday 11 September 2008 16:52:32
Répondre     Citer    
Re: variable pour boucle a partir d'un fichier texte.
Envoyé par: Sve@r

Citation
oudoubah
Par contre, pourquoi ne pas faire directement (mis
à part pour l'apprentissage):
while read line ; do
...
done < fichier_texte

Parce que je ne trouve pas cette écriture "élégante" (question de goût). Dans ma logique simplissime, je mets en premier le fichier que je traite et en second le module de traitement alors que dasn cette écriture, il y a d'abord le module de traitement puis en final le fichier traité.

Autre raison: à partir de ma façon de coder la lecture d'un fichier, il est facile de monter à la lecture de 2, 3, 4 fichiers en parallèles
#!/bin/sh
exec 3<fic1
exec 4<fic2
exec 5<fic3

while true
do
    read lig1 0<&3
    read lig2 0<&4
    read lig3 0<&5
    test -z "$lig1" -o -z "$lig2" -o -z "$lig3" && break

    echo "$lig1"
    echo "$lig2"
    echo "$lig3"
done


L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Thursday 11 September 2008 20:55:30
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
variable pour boucle a partir d'un fichier texte.
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons