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 23/08/2016, à 18:18

Slyfox

[Résolu] Awk recherche avec plusieurs valeurs dans boucle for

Bonjour,

J'ai un problème avec awk...

J'ai un fichier qui s'appelle langue.txt et contient ça:

Français
Allemend
Anglais
Japonais

... pas grand chose c'est juste pour le principe.

Maintenant le script demande quelle langue parle t'on, moi je répond par exemple "Français et Anglais", ce qui revient à dire que la variable langue vaut ça:

langue="Français Anglais"

Maintenant j'aimerais rajouter TRUE devant Français et Anglais
et FALSE devant Allemand et Japonais, voici comment de vois la chose:

#! /bin/bash

read -p 'Quelles langues parlez-vous? : ' langue

echo "${langue}"

for i in ${langue}; do

	awk '{

	if ($1=="'${i}'") 
		{printf "TRUE|%s\n" ,$0}

	else {printf "FALSE|%s\n" ,$0}
	}' langue.txt

done

Mais cela me retourne ça:

TRUE|Français
FALSE|Allemend
FALSE|Anglais
FALSE|Japonais
FALSE|Français
FALSE|Allemend
TRUE|Anglais
FALSE|Japonais

J'ai compris pourquoi... pour la simple raison que la boucle for prends d'abord "Français" et affiche le résultat puis refait la même chose avec Anglais d'où le "doublage" de lignes.

Mais comment faire pour obtenir un résultat qui ressemble (dans cet exemple) à ça:

TRUE|Français
FALSE|Allemend
TRUE|Anglais
FALSE|Japonais

Merci, je pense que c'est relativement simple mais moi là j'ai besoin de votre aide (ça fait 4h que je cherche...)

Dernière modification par Slyfox (Le 12/10/2016, à 20:23)

Hors ligne

#2 Le 23/08/2016, à 18:56

pingouinux

Re : [Résolu] Awk recherche avec plusieurs valeurs dans boucle for

Bonsoir,

#! /bin/bash

read -p 'Quelles langues parlez-vous? : ' langue

echo "${langue}"

while read lang
do
   grep -wq "$lang" <<<"$langue" && choix=TRUE || choix=FALSE
   echo "$choix|$lang"
done <langue.txt

Hors ligne

#3 Le 23/08/2016, à 19:20

Slyfox

Re : [Résolu] Awk recherche avec plusieurs valeurs dans boucle for

Salut pingouinux;

Trop fort! cool merci vraiment! smile

Sinon penses-tu que c'est réalisable avec awk ?

C'est juste pour savoir si awk est à la hauteur pour ce genre de script et si je me suis pris le chou inutilement pendant plus de 4h à vouloir faire ça avec awk.

Dernière modification par Slyfox (Le 23/08/2016, à 19:25)

Hors ligne

#4 Le 23/08/2016, à 20:27

Watael

Re : [Résolu] Awk recherche avec plusieurs valeurs dans boucle for

$ cat langue.txt 
Français
Allemend
Anglais
Japonais
$ awk 'BEGIN{ printf("%s", "Entrez votre choix : "); getline lang <"-"; gsub(" ","|",lang)}{if ($0 ~ lang)print "TRUE|"$0; else print "FALSE|"$0}' langue.txt
Entrez votre choix : Français Anglais
TRUE|Français
FALSE|Allemend
TRUE|Anglais
FALSE|Japonais

edit: tmtowtdi

Dernière modification par Watael (Le 23/08/2016, à 20:31)


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

Hors ligne

#5 Le 23/08/2016, à 20:27

pingouinux

Re : [Résolu] Awk recherche avec plusieurs valeurs dans boucle for

Sinon penses-tu que c'est réalisable avec awk ?

Oui, c'est possible aussi.

#! /bin/bash

read -p 'Quelles langues parlez-vous? : ' langue

echo "${langue}"

awk -v langue="$langue" '
{if(match(langue,"\x5c<"$0"\x5c>")) c="TRUE"; else c="FALSE"; printf("%s|%s\n",c,$0)}
' langue.txt

Hors ligne

#6 Le 23/08/2016, à 20:36

Slyfox

Re : [Résolu] Awk recherche avec plusieurs valeurs dans boucle for

Slyfox a écrit :

Sinon penses-tu que c'est réalisable avec awk ?

Et en plus j'ai le choix ! vraiment merci à vous 2, trop la classe ! cool cool cool

Juste en passant je ne comprends pas ça:

"\x5c<"$0"\x5c>"

Hors ligne

#7 Le 23/08/2016, à 20:49

pingouinux

Re : [Résolu] Awk recherche avec plusieurs valeurs dans boucle for

Juste en passant je ne comprends pas ça:

"\x5c<"$0"\x5c>"

En fait, on veut écrire ceci

"\<"$0"\>"

mais awk a alors le mauvais goût de produire ce message d'erreur

awk: cmd. line:3: warning: escape sequence `\<' treated as plain `<'
awk: cmd. line:3: warning: escape sequence `\>' treated as plain `>'

J'ai remplacé le \ par son code hexadécimal \x5c.

Le but est de faire une correspondance sur un mot complet (par exemple, Français sera reconnu, mais pas Française).

Hors ligne

#8 Le 23/08/2016, à 21:03

Watael

Re : [Résolu] Awk recherche avec plusieurs valeurs dans boucle for

tu pourrais doubler les anti-slashs  :

"\\<"$0"\\>"

jusque là (un seul anti-slash à protéger), ça va, mais c'est vrai qu'au-delà on s'y perd !

Dernière modification par Watael (Le 23/08/2016, à 21:05)


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

Hors ligne

#9 Le 23/08/2016, à 21:25

pingouinux

Re : [Résolu] Awk recherche avec plusieurs valeurs dans boucle for

Watael a écrit :

tu pourrais doubler les anti-slashs  :

Effectivement, ça marche, merci. Il y a eu des fois où je ne m'en sortais pas…

Hors ligne