Есть ли более чистый способ добавить «else, если» к назначению, условным в AWK и т. Д.?
-
02-10-2019 - |
Вопрос
Определенные языки, такие как сценарий AWK, допускают условные назначения. Например, скажем, у вас был файл списка в формате:
<item name, no spaces> <price as float>
например
Grape 4.99
JuicyFruitGum 0.45
Candles 5.99
И вы хотели облагаться налогом за 1 доллар ... вы можете использовать скрипт AWK:
awk '{a=($2>1.00)?$2*1.06:$2; print a}' prices.data
... который использует условное назначение, чтобы сократить синтаксис.
Но скажем, что вы также хотите предложить 1 доллар с всех товаров свыше 20 и 2 долларов с товаров свыше 40 долларов. Ну, на таком языке, как C, вы обычно делаете что -то вроде:
if (price > 40.00) {
price-=2;
price *= 1.06;
}
else if ( price > 20.00 && price <= 40.00 ) {
price--;
price *= 1.06;
}
else if ( price > 1.00 ) {
price*=1.06;
}
... Ну, я обнаружил, что вы могли бы сдать в сценарии или другие языки сценариев в комплексное задание. например:
awk '{a=($2>1.00)?($2>20.00)?($2-1)*1.06:($2>40.00)?($2-2)*1.06:$2*1.06:$2; print a}' prices.data
Мои вопросы в том, что
а) Совместимо ли составное задание (например,), как правило, совместно с языками сценариев, которые поддерживают условное назначение?
б) Есть ли неклайдский способ выполнить многокондиционированное назначение в сценарии AWK?
Чтобы уточнить: Я говорю исключительно о сокращении назначения (<...>? . В качестве примечания, почему я мог бы использовать сокращение, я думаю, что заслуга очевидна - что это короткое. Но, как и режима, вы можете написать хорошее описание того, что ваш запутанный синтаксис делает ради потомства.
Решение
а)
Bash, KSH и ZSH
for i in {3..5}; do for j in {2..6}; do for k in {2..4}; do
(( a = i > j ? i > k ? j > k ? i * j : i * k : j * k : 0 ))
echo $a
done; done; done
Синтаксис тройного оператора PHP аналогичен.
Python's совсем другой:
a = b if c else d if e else f if g else h
Bash, et al и Ruby (которые также поддерживают ?:
Форма) Поддержите этот стиль (показывая версию Bash):
[[ condition ]] && do_if_true || do_if_false
который можно сделать в составной форме. Это может выполнять действия в дополнение к заданиям.
б) Нет, не без явного if
/else
(или прибегая к еще большему Клудгинс творческий подход.
Другие советы
На самом деле, у C есть ?
Оператор тоже, так что вы могли бы сделать то же самое (Fugly) с C.
Тем не менее, вы, по сути, делаете там код только для записи. Если бы вы не сказали мне, что это сделало в Awk, было бы очень трудно понять это. Почему бы просто не пойти и использовать if
?
Вы благодарите себя через 6 месяцев, когда обнаружите необходимость настраивать его.
(а) Я так думаю
(б) да
Как это происходит, ваш код "C" почти законно. Следующая слегка настроенная версия работает просто отлично, как программа AWK ...
/./ {
price = $1
if (price > 40.00) {
price -= 2
price *= 1.06
} else if ( price > 20.00 && price <= 40.00 ) {
price--
price *= 1.06
} else if ( price > 1.00 ) {
price *= 1.06
}
printf("%6.2f\n", price)
}
Я вытащил полуколоны, но ничего плохого не произойдет, если вы оставите их в ...