2011-04-27 19 views
14

Estoy buscando un método para convertir una cadena en int en awk. Tengo los siguientes, que parece estar haciendo una comparación de cadenasconversión a int en awk

(nota: Campo de $ 5 es un porcentaje en uno de los dos formatos, el 80% o el 9,0%)

awk '{if (substr($5,1,(length($5)-1)) >= 90) ...

Así , cuando lo cambio a:

awk '{if (substr($5,1,(length($5)-1))+0 >= 90+0) ...

en él se compara como era mi intención. ¿Es este un elenco apropiado? ¿Hay una "mejor" forma de interpretar el reparto?

+0

por qué el +0, ¿por qué no $ 5 + 0 o eso no funciona? – HattrickNZ

Respuesta

13

Puede simplemente usar +0. decir variable v es su valor porcentual.

$ awk -v v="80.1%" 'BEGIN{print v+0.1}' 
80.2 

Usted no tiene que deshacerse del signo %.

15

La mayoría de las nuevas awks tienen una función int().

Pero el método de fundición documentado en 'The Awk Programming Language' se muestra como lo hace, utilizando numericValue y +0. No tengo el libro a mano, pero creo que también puedes elegir el valor flotante usando +0.0.

Espero que esto ayude.

0

Según the docs, int(x) cumple con POSIX. El número seguirá siendo un flotante (ya que todos los números en awk son de coma flotante) pero se truncará en un int.


Al agregar 0 no se convertirá una cadena en una int. Lo convertirá en un flotador.

Si usted tiene un viejo awk basado en The One True AWK por Brian Kernighan, como macOS awk o FreeBSD awk, verá this en la parte inferior de la página de manual:

BUGS 
    There are no explicit conversions between numbers and strings. To force 
    an expression to be treated as a number add 0 to it; to force it to be 
    treated as a string concatenate "" to it. 

    The scope rules for variables in functions are a botch; the syntax is 
    worse. 

Para forzar una expresión de ser tratado como un número de 0 a añadir que


Si no se preocupan por los flotadores y tiene gawk también se puede utilizar strtonum


Otras fuentes:

OS X version of AWK, which is derived from "The One True AWK” by Brian Kernighan

Todos los números en awk están en coma flotante:

Search "All arithmetic shall follow the semantics of floating-point arithmetic as specified by the ISO C standard"

Search "all numbers in awk are floating"