#1 Le 03/03/2018, à 12:25
- ar barzh paour
[Résolu] question sur IFS (et awk)
Résolu : voir post #2 et #3
ajouter les guillemets et présence de -F dans awk
le question principale est dans le 2ème essai du code suivant
pourquoi obtient-on un résultat vide avec awk -F'|'
et alors
pourquoi obtient-on un "bon" résultat quand on n'utilise pas -F
#!/bin/bash
oldIFS="$IFS"
res="champ1|champ2|champ3"
echo;echo "1er essai IFS non modifié , utilisation de -F'|' dans awk"
res2=$(echo $res|awk -F'|' '{print $2}')
echo "res : $res"
echo "res2 : $res2" # champ2 OK
echo;echo "2ème essai je force IFS à | ,utilisation de -F'|' dans awk"
IFS="|"
echo "res : $res" #res : champ1|champ2|champ3
echo;echo "en utilisant -F'|' dans awk on obtient le champ2 vide !"
res21=$(echo $res|awk -F'|' '{print $2}')
echo "res21 :$res21"
echo;echo "IFS est toujours à '|' et non utilisation de -F dans awk "
echo "on retrouve le champ2 !"
res22=$(echo $res|awk '{print $2}')
echo "res22 : $res22"
echo;echo "3ème essai retour IFS 'à la normale'"
IFS="$oldIFS"
echo "res : $res"
res2=$(echo $res|awk -F'|' '{print $2}')
echo "on retrouve bien le champ2"
echo "res2 :$res2"
le résultat :
1er essai IFS non modifié , utilisation de -F'|' dans awk
res : champ1|champ2|champ3
res2 : champ2
2ème essai je force IFS à | ,utilisation de -F'|' dans awk
res : champ1|champ2|champ3
en utilisant -F'|' dans awk on obtient le champ2 vide !
res21 :
IFS est toujours à '|' et non utilisation de -F dans awk
on retrouve le champ2 !
res22 : champ2
3ème essai retour IFS 'à la normale'
res : champ1|champ2|champ3
on retrouve bien le champ2
res2 :champ2
Dernière modification par ar barzh paour (Le 03/03/2018, à 17:37)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#2 Le 03/03/2018, à 13:01
- Watael
Re : [Résolu] question sur IFS (et awk)
le "problème" ne vient pas de awk :
$ (IFS='|'; var="ga|bu|zo|meuh"; echo "$var")
ga|bu|zo|meuh
$ (IFS='|'; var="ga|bu|zo|meuh"; echo $var)
ga bu zo meuh
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 03/03/2018, à 13:10
- bruno
Re : [Résolu] question sur IFS (et awk)
Bonjour,
J'avoue que je comprends pas forcément très bien ton script, mais pour commencer est-tu sûr que la variable IFS est bien prise en compte par awk ? Car d'après la documentation, ce n'est pas le cas :
Shell programmers take note: awk does not use the name IFS that is used by the POSIX-compliant shells (such as the Unix Bourne shell, sh, or Bash).
Dernière modification par bruno (Le 03/03/2018, à 13:11)
#4 Le 03/03/2018, à 13:31
- Watael
Re : [Résolu] question sur IFS (et awk)
le "problème" ne vient pas de awk
c'est les guillemets, ou leur absence en l'occurrence, qui maintiennent le caractère de l'IFS dans la chaîne affichée/envoyée dans le pipe, ou pas.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#5 Le 03/03/2018, à 17:33
- ar barzh paour
Re : [Résolu] question sur IFS (et awk)
@watael et bruno
merci à tous les deux
ok encore les guillemets !!!!!!
(et si le séparateur diffère de la normale -F est nécessaire dans awk )
IFS="|"
res="champ1|champ2|champ3"
res22=$(echo "$res"|awk '{print $2}');echo "=>$res22<="
=><=
res21=$(echo "$res"|awk -F'|' '{print $2}'); echo =>$res21<=
=>champ2<=
@bruno
j'ai écrit ce script pour essayer de résoudre un problème que j'avais trouvé dans un autre script
il ne veut rien dire de plus , divers essai mais j'ai oublié les guillemets qui produisaient le problème
Dernière modification par ar barzh paour (Le 03/03/2018, à 19:20)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#6 Le 03/03/2018, à 17:53
- bruno
Re : [Résolu] question sur IFS (et awk)
De rien mais mon intervention était tout à fait inutile
J'étais focalisé sur awk et le séparateur de champs sans me rendre compte que | était un caractère spécial pour le shell et qu'il fallait donc impérativement des guillemets autour des variables.