如何在shell中舍入输出?

时间:2017-02-13 14:11:39

标签: bash shell awk

对于我们的网上商店,我们从制造商处获得包含产品数据的csv文件(自动更新)。 有些制造商使用不含税的价格,有些则使用。

我想用shell脚本更改价格以增加21%税率并将其四舍五入到最接近的.95或.50

例如,我得到一张表:

sku|ean|name|type|price_excl_vat|price

EU-123|123123123123|Product name|simple|24.9900

我使用此代码:

sed -i "1 s/price/price_excl_vat/" inputfile
awk '{FS="|"; OFS="|"; if (NR<=1) {print $0 "|price"} else {print $0 "|" $5*1.21}}' inputfile > outputfile

输出为:

sku|ean|name|type|price_excl_vat|price

EU-123|123123123123|Product name|simple|24.9900|30.2379

如何将其四舍五入到如下所示的正确价格?

sku|ean|name|type|price_excl_vat|price

EU-123|123123123123|Product name|simple|24.9900|29.95

3 个答案:

答案 0 :(得分:1)

awk '#define field separator in and out
     BEGIN{FS=OFS="|"}

     # add/modify a 6th field for price label if missing on header only
     NR==1 && NF == 6 { $6 = "price"; print; next}
     NR==1 && NF == 5 { $6 = "price"; print; next}

     # add price with tva rounded to 0.01 if missing
     NF == 5 { $6 = int( $5 * 121 ) / 100 }

     # print the line (modified or not, ex empty lines) [7 is just a *not 0*)
     7
    ' inputfile \
 > outputfile
  • 自我记录
  • 不确定你的sed标头因为样品显示已经有价格的标题所以拿你想要的那个

答案 1 :(得分:1)

awk救援!

 awk 'BEGIN      {FS=OFS="|"} 
      $NF==$NF+0 {a=$NF*1.21; 
                  r=a-int(a); 
                  if      (r<0.225) a=a-r-0.05; 
                  else if (r<0.725) a=a-r+0.50; 
                  else              a=a-r+0.95; 
                  $(NF+1)=a} 1'

请注意,在您的示例中,30.2379的最接近的数字将为30.50或许您想要向下舍入?

要舍入而不是最近的,并使用可变价格列。新的计算值将附加到行的末尾。

 awk 'BEGIN    {FS=OFS="|"; k=5} 
      $k==$k+0 {a=$k*1.21; 
                r=a-int(a); 
                if      (r<0.50) a=a-r-0.05; 
                else if (r<0.95) a=a-r+0.50; 
                else             a=a-r+0.95; 
                $(NF+1)=a} 1'

答案 2 :(得分:0)

不知道你的程序是什么样子,很难给你更多的信息。

但是,awkbash都有printf命令。此命令可用于舍入浮点数。 (是的,Bash是整数运算,但它可以假装一个数字是十进制数。)

我为您提供了C printf命令的链接,因为Bash的命令不包含格式代码。阅读它并哭泣,因为文档有点密集,如果您之前从未使用过printf,那么理解起来可能非常困难。幸运的是,一个例子将揭示事物:

$ foo="23.42532"
$ printf "%2.2f\n", $foo
$ 23.43   #All rounded for you!

f表示它是浮点号。 %告诉您这是格式化序列的开始。 2.2表示您想要小数点左侧的2位数字和右侧的2位数字。如果您说%4.2f,它将确保在小数点左侧有足够的空间容纳四位数字,并用空格填充数字。最后的\n新行字符。

幸运的是,尽管printf起初很难理解,但几乎所有的编程语言都几乎相同。它位于awkPerlPythonCJava以及更多语言中。而且,如果您需要的信息不在printf中,请尝试使用sprintf上的文档printf,但将格式化文本打印为字符串。

我见过的最好的文档是Perl sprintf documentation,因为它给了你很多例子。