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/03/2018, à 13: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, à 18:37)


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( 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, à 14: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, à 14: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, à 14:11)

Hors ligne

#4 Le 03/03/2018, à 14: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, à 18: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, à 20:20)


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( 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, à 18:53

bruno

Re : [Résolu] question sur IFS (et awk)

De rien mais mon intervention était tout à fait inutile wink
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.

Hors ligne