[SO] Awk e supporto a comparazione tra numeri

Maurizio Pizzonia pizzonia a dia.uniroma3.it
Ven 27 Gen 2017 12:39:33 CET


Vorrei fare un piccolo addendum alla esercitazione di ieri in cui è emerso il
problema della comparazione tra numeri in awk.
Mi scuso per non essere riuscito a dare una risposta chiara a lezione. Questo
addendum dovrebbe fornire sufficienti chiarimenti. Se Roberto ha qualcosa da
aggiungere è benvenuto.

E' vero che di fatto il solo tipo di awk e la stringa e che in certi contesti le
stringhe sono trattate come numeri. E vero anche che i numeri reali sono
supportati.
Tuttavia i valori hanno anche un attributo che li etichetta come
preferenzialmente numeri o preferenzialmente stringhe.
Le regole precise le trovate qui
https://www.gnu.org/software/gawk/manual/html_node/Variable-Typing.html#Variable-Typing
https://www.gnu.org/software/gawk/manual/html_node/Comparison-Operators.html

Come visto durante l'esercitazione, il seguente esempio mostra un risultato
intatteso.
$ echo x | awk '{if ("2.1"< "11.1") print "si"; else print "no"}'
no


ma il seguente funziona
$ echo x | awk '{if (2.1< 11.1) print "si"; else print "no"}'
si

come pure il segente perché gli input vengono preferenzialmente trattati come numeri
$ echo 2.1 11.1 | awk '{if ($1< $2) print "si"; else print "no"}'
si


come pure il seguente che fa uso di un trucco per fare una sorta di "cast"
$ echo x | awk '{if ("2.1"+0< "11.1"+0) print "si"; else print "no"}'
si


Quindi, la soluzione al testo di esame esaminato a lezione non presenta le
difficoltà relative alla comparazione tra numeri come sollevato da uno di voi.

Rimane ovviamente il caveat relativo alla configurazione del sistema circa il
punto decimale e il "locale" che deve essere conforme all'input.
I dettagli li trovate qui.
https://www.gnu.org/software/gawk/manual/html_node/Locale-influences-conversions.html
Attenzione, su questo aspetto realizzazioni di verse di awk (gawk vs. mawk vs.
nawk) potrebbero avere comportamenti differenti.


Cordiali saluti,
maurizio pizzonia




Maggiori informazioni sulla lista SO