2015-07-21 96 views
0

以下條件表達式是我的輸入文件:混淆在AWK

$ cat abc 
0 1 
2 3 
4 5 

爲什麼下面舉一列輸出,而不是兩列呢?

$ cat abc | awk '{ print $1==0?"000":"111" $1==0? "222":"333" }' 
000 
333 
333 

不應該輸出以下內容嗎?

000 222 
111 333 
111 333 

回答

1

我認爲awk是要分析此爲:

awk '{ print ($1==0) ? "000" : (("111" $1==0) ? "222" : "333") }' 

也就是說,當它打印三個零,它甚至不考慮操作的其餘部分。而當它不打印三個零時,它會打印三重三分,因爲連接任何字符串的"111"不會計算爲零。

你可能想使用:

awk '{ print ($1==0?"000":"111"), ($1==0? "222":"333") }' 

其中逗號把一個空間(OFS或輸出字段分隔符,要準確)在兩個字符串之間的輸出。或者你可能更喜歡:

awk '{ print ($1==0?"000":"111") ($1==0? "222":"333") }' 

它連接兩個字符串沒有空間。

+0

爲什麼不是'($ 1 == 0?「000 222」:「111 333」)'? – Kent

+0

@Kent:我懷疑上下文會改變,並且需要兩個單獨的條件。然而,在這個問題的限制範圍內,你的簡化也會奏效 - 但它避開了這個問題。理解這個問題比選擇的規避更重要。 –

+0

有道理...... btw如果邏輯複雜,我會寫'if ...'語句,而不是嵌套'bool?foo:bar' – Kent