2015-07-21 49 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