在第二个 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 如何处理这些标记的启发,但有关这些形式的更多信息请参阅手册。|
print
awk
在你的代码中,你有
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")}'