为什么 AWK 在这个条件语句上给出错误?

为什么 AWK 在这个条件语句上给出错误?

在第二个 awk oneliner 中,我简单地切换了<for >,它给了我一个语法错误。我们不允许>在条件语句中使用吗?

~/Desktop $ awk 'BEGIN{print 3<5 ? "Hello":"World"}'
Hello
~/Desktop $ 
~/Desktop $ awk 'BEGIN{print 3>5 ? "hello": "world"}'
awk: cmd. line:1: BEGIN{print 3>5 ? "hello": "world"}
awk: cmd. line:1:                 ^ syntax error
~/Desktop $
~/Desktop $ awk 'BEGIN{print 5<3 ? "Hello":"World"}'
World
~/Desktop $
~/Desktop $

答案1

print中的声明采用awk以下三种形式之一:

  • print > expression
  • print >> expression
  • print | expression

...其中>>>|位以及expression后面的 是可选的。

print > expression命令将使输出转到由expression计算结果的任何字符串命名的文件。如果文件存在,它将被截断(清空)。这与 shell 中输出重定向的工作原理类似,但print第二次执行相同的语句不会截断文件,除非close(expression)用于关闭与expression第一次相关的文件。

命令的>>和形式也受到 shell 如何处理这些标记的启发,但有关这些形式的更多信息请参阅手册。|printawk

在你的代码中,你有

print 3 > 5 ? "Hello" : "World"

这与print > expression语法匹配,因此会将字符串输出3到名为5.该行的其余部分以问号继续,您awk无法理解它,因此它会抱怨它。一些awk实现会使用该5 ? "Hello" : "World"位作为expression,因此会写入3一个名为的文件Hello(因为5是一个真的用作布尔值时的值)。

你最可能想做的是

print ( 3 > 5 ? "Hello" : "World" )

或者

print ( 3 > 5 ) ? "Hello" : "World"

这可确保print > expression不会触发语法。

答案2

仅在演示中使用文本。

在表达式两边使用括号:

$ awk 'BEGIN{print (5>3 ? "Hello":"World")}'
Hello
$ awk 'BEGIN{print (3>5 ? "Hello":"World")}'
World

可能是,>字符被解释为重定向到打印命令的文件

答案3

您的代码在输出重定向的右侧[可能]有一个不带括号的三元表达式。有两个问题:

  • 输出(或输入)重定向右侧未加括号的表达式对于 POSIX 来说是未定义的行为,因此切勿这样做。
  • 带括号的三元表达式比带括号的三元表达式更难阅读,并且可能会导致某些 awks 在某些上下文中出现语法错误,因此也不要这样做。

坏的:

print > foo bar
getline < foo bar
str = x>y ? foo : bar

好的:

print > (foo bar)
getline < (foo bar)
str = (x>y ? foo : bar)

不过,当创建多个输出文件时,通常最好在运行时关闭它们,然后将作为表达式结果的输出文件名存储在变量中,然后不需要括号,例如:

out = foo bar
print > out
close(out)

所以你的代码:

awk 'BEGIN{print 3<5 ? "Hello" : "World"}'
awk 'BEGIN{print 3>5 ? "hello" : "world"}'
awk 'BEGIN{print 5<3 ? "Hello" : "World"}'

根据它应该做什么,要么不在输出重定向的右侧使用括号,要么不在三元组或两者周围使用括号,因此应该写为:

awk 'BEGIN{print (3<5 ? "Hello" : "World")}'
awk 'BEGIN{print (3>5 ? "hello" : "world")}'
    or, less likely, awk 'BEGIN{print 3 > (5 ? "hello" : "world")}'
awk 'BEGIN{print (5<3 ? "Hello" : "World")}'

相关内容