如果 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 退出状态。
我目前有一种 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 退出状态。