2011-10-26 11 views
8

Sto provando a dividere due campi (dove a volte il divisore potrebbe essere zero) con Awk.Awk, cercando di NON dividere per zero

Ho pensato che questo avrebbe funzionato: awk -F, '{if ($6 != 0) print $3/$6}' <some file>

Ma soffoca con fatal: division by zero attempted anche se ho pensato che il "se" condizione si prese cura di non dividere se il campo 6 è pari a zero.

Cosa sto trascurando?

+2

Si potrebbe anche scrivere "awk -F, '$ 6! = 0 {print $ 3/$ 6}' ...". Non risolverà il problema, ma è un awk più idiomatico. – onemasse

risposta

15

"bar"! = 0. se $ 6 è una stringa, il confronto non riesce, ma quando viene convertito in un numero per la divisione viene valutato a zero. Utilizzare

 
if($6 + 0 != 0) 

invece.

+2

Yikes! Un buon promemoria del fatto che awk, anche se meraviglioso per il text-munging, non era progettato per la matematica. –

+0

Grazie, mi ero dimenticato anche di Awk. –

+1

Questo è un bug nella lingua o implementazione. Se una stringa che non assomiglia ad un numero, come 'bar', si comporta come zero sotto operatori come' + 'opposto a un operando numerico, dovrebbe anche comportarsi come zero se confrontato con un numero usando operatori relazionali come' = '. Questo ** potrebbe ** funzionare perfettamente, rimanendo nel paradigma Awk. – Kaz

Problemi correlati