2011-10-26 24 views
8

Estoy tratando de dividir dos campos (donde a veces el divisor puede ser cero) con Awk.Awk, tratando de no dividir por cero

pensé que esto funcionaría: awk -F, '{if ($6 != 0) print $3/$6}' <some file>

Pero ahoga con fatal: division by zero attempted a pesar de que pensé que el "si" condición tuvo cuidado de no dividir si el campo 6 es cero.

¿Qué estoy pasando por alto?

+2

También podría escribir "awk -F, '$ 6! = 0 {print $ 3/$ 6}' ...". No resolverá el problema, pero es más idiomático awk. – onemasse

Respuesta

15

"barra"! = 0. si $ 6 es una cadena, la comparación falla, pero cuando se convierte en un número para la división, se evalúa como cero. Utilice

 
if($6 + 0 != 0) 

en su lugar.

+2

¡Yikes! Un buen recordatorio de que awk, aunque es maravilloso para el intercambio de mensajes de texto, no fue diseñado para las matemáticas. –

+0

Gracias, me había olvidado de Awk también. –

+1

Eso es un error en el lenguaje o la implementación. Si una cadena que no parece un número, como 'bar', se comporta como cero en operadores como' + 'frente a un operando numérico, también debería comportarse como cero en comparación con un número usando operadores relacionales como' = '. Esto ** podría ** funcionar perfectamente bien, mientras permaneces en el paradigma Awk. – Kaz

Cuestiones relacionadas