web-dev-qa-db-fra.com

Comment vérifier si la valeur de la variable dans le script AWK est nulle ou vide?

  1. J'utilise AWK script pour traiter certains journaux.
  2. À un endroit, je dois vérifier si la valeur de la variable est null ou vide pour prendre une décision.

Une idée comment y parvenir?

awk '

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

    }

}

' File

J'ai essayé avec

1) if(val == "")

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

ne fonctionne pas dans les deux cas.

39
samarth

La comparaison avec "" Aurait dû fonctionner, donc c'est un peu étrange

Comme autre alternative, vous pouvez utiliser la fonction length(), si zéro, votre variable est nulle/vide. Par exemple.,

if (length(val) == 0)

De plus, peut-être que la variable intégrée NF (nombre de champs) pourrait être utile? Comme nous n'avons pas accès à vos données d'entrée, c'est difficile à dire, mais une autre possibilité.

48
Levon

Cela fonctionne très bien pour moi

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

Vous ne pouvez pas faire la différence entre une variable vide et nulle, lorsque vous accédez à la variable "unset", awk l'initialise simplement avec la valeur par défaut (ici c'est "" - chaîne vide). Vous pouvez utiliser une sorte de solution de contournement, par exemple, en définissant val_accessed variable à 0 puis à 1 lorsque vous y accédez. Ou une approche plus simple (un peu "hackish") définissant val sur "unitialized" (ou à une autre valeur qui ne peut pas apparaître lors de l'exécution de votre programme).

PS: votre script me semble étrange, à quoi servent les crochets imbriqués?

12
Alexander Putilin

Vous pouvez utiliser directement la variable sans comparaison, une valeur vide/nulle/nulle est considérée comme false, tout le reste est true.

Vois ici :

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

Ce script aura donc la variable tag avec la valeur default-tag sauf si l'utilisateur l'appelle ainsi:

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

Cela est vrai à partir de: GNU Awk 4.1.3, API: 1.1 (GNU MPFR 3.1.4, GNU MP) = 6.1.0)

9
Adrien H