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 totof2000 . É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:
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 totof2000 . É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 totof2000 . Évalué à 4. Dernière modification le 24 février 2012 à 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 태 (site web personnel) . Évalué à 5.
Ç'aurait été plus clair avec
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.