Есть ли более чистый способ добавить «else, если» к назначению, условным в AWK и т. Д.?

StackOverflow https://stackoverflow.com/questions/3712380

Вопрос

Определенные языки, такие как сценарий 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)
}

Я вытащил полуколоны, но ничего плохого не произойдет, если вы оставите их в ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top