#1 Le 23/08/2016, à 18:18
- Compte supprimé
[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 Compte supprimé (Le 12/10/2016, à 20:23)
#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
- Compte supprimé
Re : [Résolu] Awk recherche avec plusieurs valeurs dans boucle for
Salut pingouinux;
Trop fort! merci vraiment!
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 Compte supprimé (Le 23/08/2016, à 19:25)
#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.
En 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
- Compte supprimé
Re : [Résolu] Awk recherche avec plusieurs valeurs dans boucle for
Sinon penses-tu que c'est réalisable avec awk ?
Et en plus j'ai le choix ! vraiment merci à vous 2, trop la classe !
Juste en passant je ne comprends pas ça:
"\x5c<"$0"\x5c>"
#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.
En ligne
#9 Le 23/08/2016, à 21:25
- pingouinux
Re : [Résolu] Awk recherche avec plusieurs valeurs dans boucle for
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