Forum Programmation.autre GNU awk

Posté par  (site web personnel) .
Étiquettes :
0
12
oct.
2004
Salut,

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  (site web personnel) . Évalué à 5.

    Le script {FS=":"; print $1} est appelé APRES avoir lu la 1ere ligne.
    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  (site web personnel) . Évalué à 2.

      ou encore et peut-être plus simple, passer le séparateur en option sur la ligne de commande :
      cat toto | awk -F":" '{print $1}'

      (sinon, entièrement d'accord avec l'explication)
    • [^] # Re: Au contraire c'est normal

      Posté par  (site web personnel) . Évalué à 1.

      Je suis tout a fait daccord que ta solution fonctionne parfaitement et merci !

      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  (site web personnel) . Évalué à 2.

        non, ce n'est pas un bug, c'est une fonctionnalité. ;-)

        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  (site web personnel) . Évalué à 1.

          Ccette explication donne un peu plus de logique en effet, mais pkoi ne lit t'il pas la ligne que quand on lui demande réellement $1 cad apres la premiere instruction.

          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.