2012-08-14 58 views
28
  1. Estoy usando AWK script para procesar algunos registros.
  2. En un solo lugar, necesito verificar si el valor de la variable es nulo o vacío para tomar una decisión.

¿Alguna idea de cómo lograr lo mismo?¿Cómo comprobar si el valor de la variable en el script AWK es nulo o está vacío?

awk ' 

{ 
    { 
     split($i, keyVal, "@") 
     key=keyVal[1]; 
     val=keyVal[2]; 
     if(val ~ /^ *$/) 
     val="Y"; 

    } 

} 

' File 

He tratado con

1) if(val == "") 

2) if(val ~ /^ *$/) 

no funciona en ambos casos.

+0

¿Podría proporcionarnos algunos datos de muestra? – Levon

Respuesta

37

La comparación con "" debería haber funcionado, así que es un poco extraño

Como una alternativa más, se puede utilizar la función length(), si es cero, la variable es nula/vacía. Por ejemplo,

if (length(val) == 0) 

También, quizás la variable incorporada NF (número de campos) podría ser útil? Sin embargo, dado que no tenemos acceso a sus datos de entrada, es difícil decirlo, pero existe otra posibilidad.

+0

Gracias, la longitud (val) está trabajando para mí. – samarth

9

funciona bien para mí

$ awk 'BEGIN{if(val==""){print "null or empty"}}' 
null or empty 

No se puede diferenciar entre estar vacía y la variable nula, cuando se accede a "desarmar" variable awk simplemente inicializa con el valor por defecto (en este caso es "" - cuerda vacía). Puede utilizar algún tipo de solución, por ejemplo, estableciendo la variable val_accessed en 0 y luego en 1 cuando acceda a ella. O una aproximación más simple (algo "hackosa") configurando val a "unitialized" (o a algún otro valor que no puede aparecer al ejecutar su programa).

PD: su script me parece extraño, ¿para qué sirven los paréntesis anidados?

2

Puede usar directamente la variable sin comparación, un valor vacío/nulo/cero se considera false, todo lo demás es true.

Ver aquí:

# setting default tag if not provided 
if (! tag) { 
     tag="devf" 
} 

Así que este script tendrá la variable tag con el valor devf excepto si el usuario lo llaman así:

$ awk -v tag=custom -f script.awk targetFile 

Esto es cierto a partir de: GNU Awk 4.1.3, API: 1.1 (GNU MPFR 3.1.4, GNU MP 6.1.0)

Cuestiones relacionadas