【问题标题】:Multiple if statements in awkawk 中的多个 if 语句
【发布时间】:2016-03-10 20:50:31
【问题描述】:

我有一个看起来像这样的文件

01/11/2015;998978000000;4890********3290;5735;ITUNES.COM/BILL;LU;Cross_border_rub;4065;17;915;INSUFF FUNDS;51;0;

有 13 个分号分隔的列。

我正在尝试计算所有行的 9 列:

awk -F ';' -vOFS=';' '{ gsub(",", ".", $9); print }' file | 
awk -F ';' '$0 = NR-1";"$0' | 
awk -F ';' -vOFS=';' '{bar[$1]=$1;a[$1]=$2;b[$1]=$3;c[$1]=$4;d[$1]=$5;e[$1]=$6;f[$1]=$7;g[$1]=$8;h[$1]=$9;k[$1]=$10;l[$1]=$11;l[$1]=$12;m[$1]=$13;p[$1]=$14;};
if($7="International") {income=0.0162*h[i]+0.0425*h[i]};
else if($7="Domestic") {income=0.0188*h[i]};
else if($7="Cross_border_rub") {income=0.0162*h[i]+0.025*h[i]}
END{for(i in bar) print income";"a[i],b[i],c[i],d[i],e[i],f[i],g[i],h[i],k[i],l[i],m[i],p[i]}'

多个 if 语句究竟如何在 awk 中正确工作?

【问题讨论】:

  • 主循环中的i 是什么(END 块之前)?
  • 我认为如果您指定要计算的内容,您将获得更好的帮助。我可以在发布的代码中看到许多效率低下的地方。
  • if () ... else if () ... 在 awk 中运行良好,但您显示的条件可以更好地放置为模式。 '$7 == "国际" { 收入=0.0162*h[i]+0.0425*h[i]}'
  • $7 每行只有一个值——您可以将 awk 视为输入文件中每一行的 for 循环。
  • 以后,学习使用编辑框左上角的{}工具来保持代码/数据/errMsgs/等的正确格式。此外,仅仅因为您的数据有 19 列,问题是否如此独特以至于所有值对于生成解决方案都很重要?如果你真的有一个 19 方面的问题,也许你需要考虑聘请顾问。通常,3-4 列应该足够该数据的预期输出。好的?!? :-) 谢谢,麻烦您了。祝你好运。

标签: bash unix awk


【解决方案1】:

awk 来救援!

您不需要多次 awk 调用。可以合二为一

$ awk -F';' -v OFS=';' '{gsub(",", ".", $9)}
      $7=="International" {income=(0.0162+0.0425)*$9}
      $7=="Domestic" {income=0.0188*$9}
      $7=="Cross_border_rub" {income=(0.0162+0.025)*$9}
  #  what happens for other values since previous income will be copied over
      {print income, NR-1, $0}' file

使用您的文件进行测试,因为您没有提供足够的样本进行测试。

如果你只分配费率可能会更好

$ awk -F';' -v OFS=';' '{gsub(",", ".", $9); rate=0}
      $7=="International" {rate=0.0162+0.0425}
      $7=="Domestic" {rate=0.0188}
      $7=="Cross_border_rub" {rate=0.0162+0.025}
      {print rate*$9, NR-1, $0}' file

【讨论】:

  • 谢谢!!!但是你能问我,我怎样才能使用 for(i in a) 和多个语句/
  • 如果列中的值超过 3,我们可以做什么?我认为必须使用 if - else
  • 这将是默认情况,在第一个块中初始化默认情况(而不是零),其他匹配项将覆盖默认情况。由于它们是互斥的,因此只有其中一个会处于活动状态。如果您一次工作一行,则不需要 for 循环(也不需要 END 块)。
  • 你能测试第二个脚本吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-28
相关资源
最近更新 更多