2012-08-14 11 views
28
  1. Sto usando lo script AWK per elaborare alcuni registri.
  2. In un punto è necessario verificare se il valore della variabile è null o vuoto per prendere una decisione.

Qualche idea su come ottenere lo stesso?Come verificare se il valore della variabile nello script AWK è nullo o vuoto?

awk ' 

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

    } 

} 

' File 

Ho provato con

1) if(val == "") 

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

non funziona in entrambi i casi.

+0

Potresti fornire alcuni dati di esempio? – Levon

risposta

37

Il confronto con "" dovrebbe avere lavorato, così che è un po 'strano

come un altro alternativa, è possibile utilizzare la funzione length(), se lo zero, la variabile è nullo/vuoto. Per esempio,

if (length(val) == 0) 

Inoltre, forse la variabile incorporata NF (numero di campi) potrebbe tornare utile? Dato che non abbiamo accesso ai dati di input è difficile dirlo, ma un'altra possibilità.

+0

Grazie, la lunghezza (val) sta funzionando per me. – samarth

9

funziona bene per me

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

Non si può distinguere tra variabili di essere vuoti e nulla, quando si accede a "unset" variabile, awk solo inizializza con il valore di default (qui è "" - stringa vuota). È possibile utilizzare una sorta di soluzione alternativa, ad esempio, impostando la variabile val_accessed su 0 e quindi su 1 quando si accede ad essa. O un approccio più semplice (un po '"hackish") che imposta val a "unitialized" (o ad un altro valore che non può apparire quando si esegue il programma).

PS: il tuo script sembra strano per me, a cosa servono le parentesi annidate?

2

È possibile utilizzare direttamente la variabile senza confronto, un valore vuoto/nullo/zero è considerato false, tutto il resto è true.

Vedi qui:

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

Quindi questo script avrà la variabile tag con il valore devf a meno che l'utente lo chiamano così:

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

Questo è vero come di: GNU Awk 4.1.3, API: 1.1 (GNU MPFR 3.1.4, GNU MP 6.1.0)