2017-02-07 53 views
0

我想在awk中使用多个'AND'和'OR'条件,但它没有给我所需的输出。相反,它不会读取我用时间“030000”给出的最后一个&&条件。在一个awk命令中``和`和`或`的多个条件

awk -F, '{if(substr($2,1,3)=="301" && $15=="996" || $15=="429" && $5>=030000 && $5<=035000) print $2"|"$15"|"$5}' 2017020* | head -10 

3014241320|996|235939 
3017943809|996|235953 
+0

你的输入文件是什么?和预期的产出? – Inian

+1

'||'的优先级低于'&&'(比如'+'和'*'),所以请尝试'... &&($ 15 ==“996”|| $ 15 ==“429”)&& .. .'。 –

回答

1

看起来你错过了围绕OR操作的括号。它应该是:

if(substr($2,1,3)=="301" && ($15=="996" || $15=="429") && $5>=030000 && $5<=035000) ... 

请参阅boolean algebra

0

在awk中,&&||更高的优先级,让你的条件实际上意味着

(substr($2,1,3)=="301" && $15=="996") 
|| 
    ($15=="429" && $5>=030000 && $5<=035000) 

您的$5测试仅适用于线,其中$15=="429"是真实的,这是不是在你的例子输出的情况下线。

使用括号更改:

awk -F, '{if(substr($2,1,3)=="301" && ($15=="996" || $15=="429") && $5>=030000 && $5<=035000) print $2"|"$15"|"$5}' 2017020* | head -10 

作为一般规则,我总是会加上括号混合逻辑AND和OR,即使不是绝对必要的任何语言表达。这有助于可读性并避免令人讨厌的意外(有些语言与AND和OR有不同的优先级)。