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

  1. j'utiliseawk script pour traiter certains journaux.
  2. À un endroit, j'ai besoin de vérifier si la valeur de la variable null ou vide pour rendre une décision.

Une idée de comment réaliser la même chose?

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.

34
demandé sur Benjamin W. 2012-08-14 17:03:01

3 réponses

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

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

if (length(val) == 0)

En outre, peut-être la variable intégrée NF (Nombre de champs) pourrait être utile? Puisque nous n'avons pas accès à vos données d'entrée, il est difficile de dire, mais une autre possibilité.

44
répondu Levon 2012-08-14 14:02:32

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 la variable étant vide et null, 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, la mise en val_accessed variable 0, puis sur 1 lorsque vous y accédez. Ou une approche plus simple (un peu "hackish") définissant val à "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 parenthèses imbriquées?

10
répondu Alexander Putilin 2012-08-14 13:15:14

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

Voir ici :

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

, Donc ce script contient la variable tag avec la valeur default-tag, sauf si l'utilisateur de l'appeler comme ceci :

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

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

6
répondu Adrien H 2018-07-20 12:31:51