如果 awk returns null 处理表达式,如何 return 0?

How to return 0 if awk returns null from processing an expression?

我目前有一种 awk 方法来解析表达式输出是否包含多行。如果是,它聚合并打印总和。例如:

someexpression=$'JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)'

可能是不会产生任何信息的单行。那么,

echo "$someexpression" | awk '
NR>1 {a[]++}
END {
    for (i in a) {
        printf "%d\n", a[i]
    }
}'

这将产生 NULL 或空 return。相反,我想让它 return 如果为空则为 $0$ 的数值。我怎样才能修改上面的内容来做到这一点?

你可以在for循环中保留一个标志来检测循环是否已经执行:

echo "$someexpression" |
awk 'NR>1 {
   a[]++
}
END
{
   for (i in a) {
      p = 1
      printf "%d\n", a[i]
   }
   if (!p)
      print "[=10=]$"
}'

$0$

在 UNIX 中什么都没有 "returns" 任何东西(尽管不幸命名的关键字用于设置函数的退出状态),所有东西(工具、函数、脚本)都输出 X 并以状态 Y 退出。

考虑这 2 个名为 foo() 的相同函数,一个在 C 中,一个在 shell 中:

C(x=foo()表示将x设置为foo()return代码

foo() {
    printf "7\n";    // this is outputting 7 from the full program
    return 3;        // this is returning 3 from this function
}
x=foo();  <- 7 is output on screen and x has value '3'

shell(x=foo表示将x设置为foo()输出

foo() {
    printf "7\n";    # this is outputting 7 from just this function
    return 3;        # this is setting this functions exit status to 3
}
x=foo  <- nothing is output on screen, x has value '7', and '$?' has value '3'

请注意,return 语句的作用在每个语句中都大不相同。在 awk 脚本中,函数中的打印和 return 代码的行为与它们在 C 中的行为相同,但就调用 awk 工具而言,在外部它的行为与所有其他 UNIX 工具相同 shell脚本并生成输出并设置退出状态。

因此,在 UNIX 中讨论任何内容时,请避免使用术语“return”,因为它不精确且含糊不清,因此不同的人会认为您指的是“输出”,而其他人则认为您指的是“退出状态”。

在这种情况下,I 假设您的意思是“输出”,但是当没有像 grep 那样的匹配时,您应该考虑设置一个非零退出状态,例如:

echo "$someexpression" | awk '
NR>1 {a[]++}
END {
    for (i in a) {
        print a[i]
    }
    exit (NR < 2)
}'

然后您使用上述代码的代码可以测试 success/fail 退出状态,而不是测试特定的输出值,就像您使用 grep.[= 进行等效操作一样24=]

您当然可以将以上内容调整为:

echo "$someexpression" | awk '
NR>1 {a[]++}
END {
    if ( NR > 1 ) {
        for (i in a) {
            print a[i]
        }
    }
    else {
        print "[=13=]$"
        exit 1
    }
}'

如有必要,您将获得特定的输出值和 success/fail 退出状态。