2017-02-07 5 views
0

Я пытаюсь использовать несколько условий «AND» и «OR» в awk, но это не дает мне желаемого результата. Вместо этого он не читает последние && условия, которые я дал со временем «030000».несколько условий `and` и` or` в одной команде 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

'||' имеет более низкий приоритет, чем '&&' (например, '+' vs. '*'), поэтому попробуйте '... && ($ 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 ...).