为什么 awk 'NR%2 == 1?ORS=";":ORS="\n"' 会出现语法错误?

Shu*_*mar 2 awk

我正在解决输出为的 Hackerrank 问题

A 25 27 50;B 35 37 75
C 75 78 80;D 99 88 76 
Run Code Online (Sandbox Code Playgroud)

用于输入

A 25 27 50
B 35 37 75
C 75 78 80
D 99 88 76.
Run Code Online (Sandbox Code Playgroud)

我正在ORS用来完成上述任务。但我不知道为什么会出现运行时错误?

awk 'NR%2 == 1?ORS=";":ORS="\n"'
Run Code Online (Sandbox Code Playgroud)

错误来了

awkNR: cmd. line:1: Possible syntax error
Run Code Online (Sandbox Code Playgroud)

Ed *_*ton 12

不带括号的三元表达式会在各种上下文中的各种 awk 版本中导致语法错误,而不仅仅是已经提到的上下文和 awk 版本。这是 MacOS 上的另一个示例:

$ awk --version
awk version 20070501

$ awk 'BEGIN{print 1 == 2 ? 3 : 4}'
awk: syntax error at source line 1
 context is
    {print 1 >>>  == <<<
awk: illegal statement at source line 1
awk: illegal statement at source line 1

$ awk 'BEGIN{print (1 == 2 ? 3 : 4)}'
4

$ awk 'BEGIN{print (1 == 2) ? 3 : 4}'
4
Run Code Online (Sandbox Code Playgroud)

在这 2 个工作中,我发现print (1 == 2 ? 3 : 4)更具可读性,尤其是当您获得嵌套的三元组时:

$ awk 'BEGIN{print (1 == 2 ? (6 == 7 ? 8 : 3) : 4)}'
4

$ awk 'BEGIN{print (1 == 2) ? (6 == 7) ? 8 : 3 : 4}'
4
Run Code Online (Sandbox Code Playgroud)

所以这就是我一直使用的,并且如果/当有用时另外在条件周围添加括号,通常是为了可读性。

由于带括号的三元组总是比不带括号的更容易阅读,因此没有充分的理由编写不带括号的三元组。

您也不应该在条件上下文中使用赋值,除非您需要将赋值的结果作为条件进行评估,而您不需要。

你想要做的应该写成:

$ awk '{ORS=(NR%2 ? ";" : RS)} 1' file
A 25 27 50;B 35 37 75
C 75 78 80;D 99 88 76
Run Code Online (Sandbox Code Playgroud)


Fre*_*ddy 7

Busyboxawk似乎需要在最后两个操作数周围加上括号。

我得到同样的错误

$ busybox awk 'NR%2 == 1?ORS=";":ORS="\n"' file
awkNR: cmd. line:1: Possible syntax error
Run Code Online (Sandbox Code Playgroud)

但它适用于

$ busybox awk 'NR%2 == 1?(ORS=";"):(ORS="\n")' file
A 25 27 50;B 35 37 75
C 75 78 80;D 99 88 76
Run Code Online (Sandbox Code Playgroud)