Awk

為什麼 awk ‘NR%2 == 1?ORS=’;’:ORS=‘n’’ 給出語法錯誤?

  • April 18, 2022

我正在解決輸出為的 Hackerrank 問題

A 25 27 50;B 35 37 75
C 75 78 80;D 99 88 76 

用於輸入

A 25 27 50
B 35 37 75
C 75 78 80
D 99 88 76.

ORS用來做上述任務。但我不知道為什麼會出現執行時錯誤?

awk 'NR%2 == 1?ORS=";":ORS="\n"'

錯誤來了

awkNR: cmd. line:1: Possible syntax error

Busyboxawk似乎需要在最後兩個操作數周圍加上括號。

我得到同樣的錯誤

$ busybox awk 'NR%2 == 1?ORS=";":ORS="\n"' file
awkNR: cmd. line:1: Possible syntax error

但它適用於

$ 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

不帶括號的三元表達式會在各種上下文中導致各種 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

在這兩個工作中,我發現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

所以這就是我一直使用的,並且在有用的情況下額外添加括號,通常是為了可讀性。

由於帶括號的三元組總是比不帶括號的更容易閱讀,因此沒有充分的理由編寫沒有括號的三元組。

您也不應該在條件上下文中使用賦值,除非您需要將賦值的結果作為條件進行評估,而您不需要。

你想要做的應該寫成:

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

引用自:https://unix.stackexchange.com/questions/588714