Soit le fichier toto contenant les lignes suivantes:
toto:XXXXXXX
tata:YYYYYYY
tutu:ZZZZZZZ
soit la commande suivante:
$ cat toto | awk '{FS=":"; print $1}'
toto:XXXXXXX
tata
tutu
le résultat n'est pas conforme à ce je devrait attendre, j'ai remarqué que TOUS mes traitements de ce type (quelque soit la distribution ou même la version de GNU Awk) se passe mal pour le premier élément.
Tests sur:
Debian/Sid : GNU Awk 3.1.4
Debian/Woody: GNU Awk 3.1.0
Redhat: GNU Awk 3.1.0
Slackware: GNU Awk 3.1.3
une lumière pourrait éclairé ma lanterne ?
merci ;)
# Au contraire c'est normal
Posté par -=[ silmaril ]=- (site web personnel) . Évalué à 5.
Il faut donc soit dans le cas de la premiere ligne demander a awk de relire la ligne apres avoir changer le Field Separator (crade), Soit changer le FS plus tot (propre).
Comme cela:
cat toto | awk 'BEGIN {FS=":";} {print $1}'
[^] # Re: Au contraire c'est normal
Posté par Sylvain Rampacek (site web personnel) . Évalué à 2.
cat toto | awk -F":" '{print $1}'
(sinon, entièrement d'accord avec l'explication)
[^] # Re: Au contraire c'est normal
Posté par Sylvain Rampacek (site web personnel) . Évalué à 3.
awk -F":" '{print $1}' toto
qui évite le "pipe" de la commande précédente (donc un seul processus au lieu de deux).
[^] # Re: Au contraire c'est normal
Posté par Yann 'Ze' Richard (site web personnel) . Évalué à 1.
Par contre je m'interoge sur le fait que le script soit executé qu'après avoir lu la premiere ligne. Ce fonctionnement me semble illogique. Pourquoi après la premiere ligne ? Je trouve pas très logique que mon bloc d'instruction soit executé au millieu du flux (pas au milieu je sais) et pas avant. Bref pour moi c'est plus de l'ordre du bug quand même vous en pensez quoi ?
[^] # Re: Au contraire c'est normal
Posté par Sylvain Rampacek (site web personnel) . Évalué à 2.
et oui, awk dit que le bloc entre {} tout seul est exécuté après la lecture d'une ligne.
donc si tu veux faire des initialisations avant la première ligne, il faut passer par le bloc BEGIN{}.
de même pour un traitement à la fin de ton flux, tu doit mettre END{}.
car en plus, pour analyser le contenu de tes {}, il doit connaître le contenu de la ligne qu'il a à traiter. Sinon, comment doit-il savoir ce qu'il va traiter ou non si tu mélanges avec les $1 qui permettent de récupérer le contenu ??
[^] # Re: Au contraire c'est normal
Posté par Yann 'Ze' Richard (site web personnel) . Évalué à 1.
En tout cas merci pour cette explication claire!
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.