Forum Programmation.shell Problème avec awk

Posté par .
Tags :
1
24
fév.
2012

Bonjour à tous,

j'ai récupérer un programme qui crache du texte tabulé de la forme :

mot nombre mot mot ...
mot nombre mot mot ...

or les résultats qui m'intéresse ont pour valeur de nombre 83 et 99. Comme c'est un cas fréquent le concepteur du programme donne un "tips" dans la doc. Sous cette forme :

gauthier ~ 17:13 :$ son_programme /donne/en/entree | awk 'and($2, 0x0002) && and($2, 0x0040)'

Le résultat est impeccable, ca correspond exactement a ce que je veut extraire. Seulement impossible de comprendre comment ça marche. Ça fait une heure que je fais des ET binaire dans tout les sens et je ne comprends pas comment fonctionne cette commande. Une bonne âme pourrait elle m'expliquer ?

Merci d'avance

  • # man est ton ami

    Posté par . Évalué à 5.

    En regardant le man, tu te rendras compte que and est une gnuserie : pas portable même si pratique.

    Bit Manipulations Functions
    Starting with version 3.1 of gawk, the following bit manipulation functions are available. They work by converting double-precision
    floating point values to unsigned long integers, doing the operation, and then converting the result back to floating point. The func-
    tions are:

       and(v1, v2)         Return the bitwise AND of the values provided by v1 and v2.
    
    

    83 en hexa: = 53, soit en binaire 0101 0011

    99 en hexa => 63, soit en binaire 0110 0011

    0x02 2 en binaire => 0000 0001
    0x04 en binaire => 0000 0010

    Son truc c'est un masque sur les deux derniers bits, et vérification que ceux-ci sont bien à 1, la partie supérieure n'a apparamment pas de signification pour le test qui t'intéresse.

    A sa place j'aurais fait un truc du genre :
    gauthier ~ 17:13 :$ son_programme /donne/en/entree | awk ' and($2,3) = 3'

    • [^] # Re: man est ton ami

      Posté par . Évalué à 2.

      Petite erreur que je corrige :
      gauthier ~ 17:13 :$ son_programme /donne/en/entree | awk ' and($2,3) == 3'

      • [^] # J'ai racconté n'importe quoi

        Posté par . Évalué à 4. Dernière modification le 24/02/12 à 18:08.

        2 en binaire c'est pas 0000 0001 mais 0000 0010
        Et 0x0040 c'est pas 0000 0010 mais 0100 0000

        Donc il ne teste pas les deux derniers bits.

        C'est toujours un test de bits à un que j'aurais fait comme ça mais le masque ne se fait pas sur 0000 0011 mais sur 0100 0010, ce qui fait en test :
        gauthier ~ 17:13 :$ son_programme /donne/en/entree | awk ' and($2,0x42)==0x42'

    • [^] # Re: man est ton ami

      Posté par (page perso) . Évalué à 5.

      Ç'aurait été plus clair avec

      awk '$2==83||$2==99'
      
      

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.