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 03/09/2015, à 11:03

Luminhir

Scripting bash problème boucle while

Bonjour tout le monde,

Etant novice dans la programmation de script, j'ai choisi le langage que je connaissais le mieux pour écrire mon plugin, le bash en l’occurrence.

Cependant mes compétences étant assez limité je voudrais vous exposer mon problème.

Je récupère deux fichiers, nommons les fichierA et fichierB. Les fichiers ont la structure suivante :

fichierA    fichierB

a              1
b              2
c              3
d              4
e              5
f               6
g              7

J'aimerais utiliser une ou plusieurs boucle afin d'avoir un unique fichier ayant la structure :

fichier

a = 1
b = 2
c = 3
d = 4
e = 5
f = 6
g = 7


J'ai déjà essayé avec deux boucles while imbriquées comme ceci :

while read lineA
do
while read lineB
do
echo $lineA" = "$lineB
done < fichier B
done < fichierA

Bien entendu le résultat a été :

a = 1
a = 2
a = 3
a = 4
.......
b = 1
b = 2
b =3
...... etc ,etc, etc...

J'ai aussi tenté avec un break comme ceci :

while read lineA
do
while read lineB
do
echo $lineA" = "$lineB
break
done < fichier B
done < fichierA

Mais la deuxième boucle ne garde que la première valeur de "lineB" soit :

a = 1
b = 1
c = 1
d = 1
e = 1
f = 1
g = 1

Donc pas trop le résultat attendu..

C'est pourquoi je viens vers vous, si jamais vous avez des suggestions ou des améliorations de code je vous en remercie d'avance  smile

des bisous

Dernière modification par Luminhir (Le 03/09/2015, à 11:06)

Hors ligne

#2 Le 03/09/2015, à 11:15

pingouinux

Re : Scripting bash problème boucle while

Bonjour,
Par exemple

$ paste -d= fichierA fichierB
a=1
b=2
c=3
d=4
e=5
f=6
g=7

ou bien

$ paste -d= fichierA fichierB | sed 's/=/ = /'
a = 1
b = 2
c = 3
d = 4
e = 5
f = 6
g = 7

Dernière modification par pingouinux (Le 03/09/2015, à 11:18)

Hors ligne

#3 Le 03/09/2015, à 11:38

credenhill

Re : Scripting bash problème boucle while

hello
ou aussi

$ pr -tms= a b
a=1
b=2
c=3
d=4
e=5
f=6
g=7
$ pr -tms' = ' a b
a = 1
b = 2
c = 3
d = 4
e = 5
f = 6
g = 7

Dernière modification par credenhill (Le 03/09/2015, à 11:41)

Hors ligne

#4 Le 03/09/2015, à 11:40

Hizoka

Re : Scripting bash problème boucle while

Salut avec une boucle :

nombre_de_ligne=7
for ((x=1; x <= ${nombre_de_ligne}; x ++))
do
 echo "$(sed -n "${x}p" a) = $(sed -n "${x}p" 1)"
done

pingouinux => tu trouves toujours de sacrées solutions smile
Merci pour la commande !

EDIT:
credenhill => je ne connaissais pas non plus...

Ma version à moi me permet de mettre de la couleur XD

FUSHIA="\033[1;35m"
RAZ="\e[m"
BLEUFONCE="\033[1;34m"
VERT="\033[0;32m"

nombre_de_ligne=7
for ((x=1; x <= ${nombre_de_ligne}; x ++))
do
 echo -e "${FUSHIA}$(sed -n "${x}p" a) ${VERT}= ${BLEUFONCE}$(sed -n "${x}p" 1)${RAZ}"
done

Dernière modification par Hizoka (Le 03/09/2015, à 11:43)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

En ligne

#5 Le 03/09/2015, à 12:05

Watael

Re : Scripting bash problème boucle while

salut,

Hizoka : tous ces appels à sed, ce n'est pas très économique. sad

$ while read lineA; do read lineB <&3; echo "$lineA = $lineB"; done <a 3<b
a = 1
b = 2
c = 3
d = 4
e = 5
f = 6
g = 7

on redirige le contenu du fichier b vers un descripteur de fichier, et on lit depuis ce même descripteur pour chaque ligne du fichier a.

Évidemment, je plussoie l'emploi de pr qui se suffit à lui-même; s'il faut utiliser, pour ça, sed derrière une commande, alors une solution 100% awk est peut-être préférable (?).


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 03/09/2015, à 12:17

pingouinux

Re : Scripting bash problème boucle while

Ma seconde commande en #2 ne marche pas si fichierA contient le caractère "=". Les commandes de credenhill #3 et de Watael #5 n'ont pas cet inconvénient.

Hors ligne

#7 Le 03/09/2015, à 12:32

credenhill

Re : Scripting bash problème boucle while

avec awk

$ awk '{getline b < "b"; print $1 " = " b}' a
a = 1
b = 2
c = 3
d = 4
e = 5
f = 6
g = 7

Hors ligne

#8 Le 03/09/2015, à 12:47

Luminhir

Re : Scripting bash problème boucle while

Merci beaucoup à vous tous pour votre aide !

Ca fait plaisir de voir des gens investis smile

Je vous tiens au courant des tests que je vais faire par rapport à vos conseils !

des bisous

Hors ligne

#9 Le 03/09/2015, à 14:20

Hizoka

Re : Scripting bash problème boucle while

Watael => ouais je sais bien tongue
ça passe s'il n'y a pas beaucoup de lignes...

Peux tu décrire un peu plus ta commande ?

while read lineA
do
read lineB <&3
echo "$lineA = $lineB"
done <a 3<b

Qu'est ce qu'un descripteur de fichier ? (je ne connaissais pas ce fameux 3)
comment lineB sait il quel ligne il doit lire ?
quand je teste il me manque une ligne (la dernière).

En tout cas bravo et merci pour ce genre de propositions intéressantes smile


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

En ligne

#10 Le 03/09/2015, à 14:57

Watael

Re : Scripting bash problème boucle while

?
c'est un peu comme si tu me demandais "c'est quoi un doigt ?" : je sais m'en servir, mais je ne saurais pas vraiment dire ce que c'est.

chaque processus se voit attribuer 3 descripteurs standards (in=0, out=1, err=2).
il est possible d'en créer davantage, ou de les dupliquer/rediriger.
3 est un nombre arbitraire, supérieur à 2, qui est la sortie d'erreur.

avec Bash, on peut ne pas se soucier du numéro à donner :

ls /dev/fd/
exec {A}<a {B}<b
ls /dev/fd/
while read -u $A lineA; do read -u $B lineB; echo "$lineA = $lineB"; done
exec {A}<&- {B}<&-
ls /dev/fd/

les descripteurs de fichiers sont "consommés" (first in / first out) par leur lecture.

s'il te manque la dernière ligne, c'est peut-être dû à la façon dont tu as créé le fichier ?

Dernière modification par Watael (Le 03/09/2015, à 15:00)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#11 Le 03/09/2015, à 16:15

Luminhir

Re : Scripting bash problème boucle while

Après quelques tests j'ai choisi la solution de Watael.
Plus compréhensible pour moi et plus facile à modifier (pour moi).

Merci encore à tout le monde ! smile


des bisous

Hors ligne

#12 Le 03/09/2015, à 16:17

Hizoka

Re : Scripting bash problème boucle while

merci pour les infos même si je doute pouvoir le replacer wink


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

En ligne