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.
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é.
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?
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)