如何检查AWK脚本中的变量值是null还是空?

时间:2012-08-14 13:03:01

标签: unix awk

  1. 我正在使用 AWK 脚本来处理一些日志。
  2. 在某个地方,我需要检查变量值是 null 还是为空来做出决定。
  3. 任何想法如何实现同样的目标?

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

    我试过

    1) if(val == "")
    
    2) if(val ~ /^ *$/)
    

    两种情况都不起作用。

3 个答案:

答案 0 :(得分:45)

""的比较应该有效,所以有点奇怪

作为另一种选择,您可以使用length()函数,如果为零,则您的变量为null / empty。如,

if (length(val) == 0)

另外,也许内置变量NF(字段数)可以派上用场?由于我们无法访问您的输入数据,因此很难说,但另一种可能性。

答案 1 :(得分:11)

它适用于我

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

你无法区分变量为空和null,当你访问“unset”变量时,awk只是用默认值初始化它(这里是"" - 空字符串)。您可以使用某种解决方法,例如,将val_accessed变量设置为0,然后在访问时设置为1。或者更简单的方法(有些“hackish”)将val设置为"unitialized"(或者运行程序时无法显示的其他值)。

PS:你的脚本对我来说很奇怪,什么是嵌套括号?

答案 2 :(得分:8)

您可以直接使用变量而不进行比较,将空/ null /零值视为false,其他所有值均为true

见这里:

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

所以这个脚本的变量tag的值为default-tag,除非用户这样调用它:

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

以下情况属实: GNU Awk 4.1.3,API:1.1(GNU MPFR 3.1.4,GNU MP 6.1.0)