Scripting 是否有更简洁的方法来添加“;否则,如果;要在Awk等中指定条件吗。?

Scripting 是否有更简洁的方法来添加“;否则,如果;要在Awk等中指定条件吗。?,scripting,awk,conditional,variable-assignment,compound-assignment,Scripting,Awk,Conditional,Variable Assignment,Compound Assignment,某些语言(如awk脚本)允许条件赋值。例如,假设您有一个以下格式的列表文件: <item name, no spaces> <price as float> 你想对超过1美元的东西征税。。。您可以使用awk脚本: awk '{a=($2>1.00)?$2*1.06:$2; print a}' prices.data …它使用条件赋值来缩短语法 但是,假设你还想为所有超过20美元的商品提供1美元的折扣,以及超过40美元的商品提供2美元的折扣。在c语言中,您通常会执

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

<item name, no spaces> <price as float>
你想对超过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;
}
我的问题是

a)复合赋值(像这样)一般与支持条件赋值的脚本语言兼容吗?
b)在awk脚本中,有没有一种非笨拙的方法来执行多条件赋值


澄清:我只是在谈论作业的速记(?:;),不是传统的条件赋值,我已经知道如何在Awk脚本中进行类似c的复合赋值。作为旁注,关于我为什么可能使用速记,我认为其优点是显而易见的——它很短。但是像正则表达式一样,为了子孙后代的缘故,您可能想写一篇关于您混乱的语法的很好的描述。

Ac实际上,C也有
操作符,所以你可以用C做同样的事情

但是,您实际上是在那里编写只写代码。如果您没有告诉我awk语句的作用,那么很难理解它。为什么不直接使用
If

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

(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)
}
/。/{
价格=$1
如果(价格>40.00){
价格-=2
价格*=1.06
}其他条件(价格>20.00和价格1.00){
价格*=1.06
}
printf(“%6.2f\n”,价格)
}
我把分号去掉了,但是如果你把它们留在里面,就不会有什么不好的事情发生。

a)

Bash、ksh和zsh支持复合条件(三元)运算符(不过Bash不进行浮点运算):

PHP的三元运算符语法类似

Python的情况大不相同:

a = b if c else d if e else f if g else h
Bash等人和Ruby(也支持
?:
表单)支持这种样式(显示Bash的版本):

这可以以复合形式完成。这可以执行作业之外的操作


b)不,不是没有明确的
if
/
else
(或者诉诸更笨拙的创造力。

呃……我只是指作业速记()?:…我已经知道如何使用传统的条件复合赋值。我在我的帖子中添加了额外的说明,这样就不会有其他人像你一样困惑。好的,明白了,但你确实说了“用像C这样的语言”,你的“C”有点酷在
awk
工作过。显然,
if-then-else
有一个一般的等价关系:
if-then-else
。现在,酷的前沿是Ruby之类的东西,它允许你说
(x?y:z;随便什么;如果x…;和_-do_-else)
,你可以把它放在任何地方,包括(((((((((((()))中表达式中的任意语句)…是的,我知道这有点让人困惑…很抱歉。这听起来像是Ruby中复合执行的一个有趣工具…如果你理解语法,你可以将它分解成一系列If语句,这应该不会太难理解。另外,这就是你的一行程序文件中的注释的用途:)我喜欢它,因为它很短,但如果有这样的事情,我更喜欢一个适当的复合条件缩短…哇,很好的答案!先生,你真是个脚本专家。就是我想要的那种信息。。。你有没有想过写一本脚本书P@Jason当前位置这个想法在我脑海中闪过,但是书中已经没有钱了。那么也许有一个网站似乎有某种方法可以在金钱上很好地利用这种教育才能。尽管如此,我们还是非常感谢您的频繁(免费)帮助!
/./ {
  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)
}
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
a = b if c else d if e else f if g else h
[[ condition ]] && do_if_true || do_if_false