是否有更简洁的方法在Awk等中添加“else if”赋值条件?

时间:2010-09-14 19:56:00

标签: scripting awk conditional variable-assignment compound-assignment

某些语言(如awk脚本)允许条件分配。例如,假设您有一个格式为的列表文件:

<item name, no spaces> <price as float>

e.g。

Grape 4.99
JuicyFruitGum 0.45
Candles 5.99

你想要对超过1美元的所有东西征税......你可以使用awk脚本:

awk '{a=($2>1.00)?$2*1.06:$2; print a}' prices.data

...使用条件赋值来缩短语法。

但是说你想要超过20美元的所有商品减去1美元,超过40美元的商品减2美元。那么在像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或其他脚本语言整合到COMPOUND赋值中。 e.g:

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

我的问题是,

a)是复合赋值(像这样),通常与支持条件赋值的脚本语言兼容吗?
b)在awk脚本中是否有非kludge方式进行多条件赋值?

澄清:我只是谈论作业的简写(&lt; ...&gt;?&lt; ...&gt;:&lt; ...&gt ;;,而非传统条件赋值,我已经知道如何在Awk脚本中进行类似c的复合赋值。作为旁注,至于为什么我可以使用速记,我认为优点是显而易见的 - 它很短。但就像正则表达式一样,你可能想要写一个很好的描述你的混乱语法为后人的缘故。

3 个答案:

答案 0 :(得分:2)

<强> A)

Bash,ksh和zsh支持复合条件(三元)运算符(但Bash不支持浮点数):

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是完全不同的:

a = b if c else d if e else f if g else h

Bash等人和Ruby(也支持?:形式)支持这种风格(显示Bash的版本):

[[ condition ]] && do_if_true || do_if_false

可以以复合形式完成。除分配外,这还可以执行操作。

b)不,没有明确的if / else(或诉诸更多 kludginess 创造力。

答案 1 :(得分:0)

实际上,C也有?运算符,所以你可以用C做同样的事情。(/ p>

但是,你实际上是在那里制作只写代码。如果你没有告诉我awk声明做了什么,那么很难弄明白。为什么不继续使用if

当你发现需要调整它时,你会在6个月内感谢自己。

答案 2 :(得分:0)

(a)我想是

(b)是


碰巧,你的“C”代码几乎是合法的awk。以下稍微调整过的版本可以作为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)
}

我把分号拿出来了,但是如果你把它们留下来就没有什么不好的事了......