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