Awk
為什麼 awk ‘NR%2 == 1?ORS=’;’:ORS=‘n’’ 給出語法錯誤?
我正在解決輸出為的 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
Busybox
awk
似乎需要在最後兩個操作數周圍加上括號。我得到同樣的錯誤
$ 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