我正在解决输出为的 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)
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)