在一个 awk 命令中出现“and”和“or”的多个条件



我正在尝试在awk中使用多个"AND"和"OR"条件,但它没有给我所需的输出。相反,它不会读取我用时间"030000"给出的最后&&条件。

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

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

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

参见布尔代数。

在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 有不同的优先级......

最新更新