2015-06-14 4 views
2

Похожего поста здесь: awk if statement with simple mathс использованием AWK для вычитания

Ниже велик, но теперь мне нужно вычесть 20 из поля $ 4, если это меньше, чем 20, и если его больше, чем 20, поле пять может быть установлено в 0.

31590,Foo,70,3.5 
28327,Bar,291,14.55 
25155,Baz,583,29.15 
24179,Food,694,34.7 
28670,Spaz,67,3.35 
22190,bawk,4431,132.93 
29584,alfred,142,7.1 
27698,brian,379,18.95 
24372,peter,22,1.1 
25064,weinberger,8,.04 

У меня было что-то похожее на эту работу, но теперь есть некоторые ошибки.

{print $0, $4-($4>20?$4:20)}

Поскольку поле $ 4 может быть меньше, чем 20, я не уверен, что выше будет на самом деле вок, как я действительно хочу 20 - $ 4 не $ 4 - 20.

Это дает мне $ 4-20 : {print $0, $4-($4<20?20:$4)}, но мне нужно 20-4, если $ 4 меньше, чем 20. Если $ 4> 20 поле $ 5 0.

+0

В вашем файле всего 3 поля – bkmoney

+0

Вы хотите 20 - $ 4 или $ 4 - 20, ваше сообщение, кажется, противоречит самому себе – bkmoney

+0

Это дает мне 4-20 долларов: '{print $ 0, $ 4 - ($ 4 <20? 20: $ 4)} ', но мне нужно 20-4, если $ 4 меньше 20. Если $ 4> 20 поле $ 5 равно 0. –

ответ

4

Я думаю, что вам нужно, это

{print $0, 20 - ($4 < 20 ? $4 : 20)} 

Или сделать его еще более простым

{print $0, ($4 < 20 ? 20 - $4 : 0)} 

Если $ 4 меньше, чем 20, это возвращает 20 - $ 4 в пятом поле.

Если $ 4 больше или равно 20, это возвращает 0 в качестве пятого поля.

+0

Это было слишком просто! У меня было, хотя g/awk потребовало бы, чтобы поле вне круглых скобок регистрировало поле, поэтому я никогда не пробовал 20-! Спасибо. –

+1

Awk ничего не требует, чтобы «зарегистрировать поле», он просто оценивает выражение и распечатывает его, подобно большинству языков программирования. – bkmoney

Смежные вопросы