2017-02-07 48 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有不同的優先級)。