2017-02-13 55 views
0

对于我们的网上商店,我们从制造商那里获得一个带有产品数据的csv文件(自动更新)。有些制造商使用价格不含税和其中一些。如何在shell中对输出进行舍入?

我想改变价格与shell脚本中添加21%的税收和圆形它最近的0.95或0.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 
+2

为什么'30.2379'不能成为'30.50'而不是'29.95'? – anubhava

回答

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' 
+0

awk就是我用过的。但是,正常的打印确实下降到* .95或* .50 –

+0

你试过这个脚本吗?它会绕过**最近** 0.95或0.50。你需要稍微改变这个条件来使** DOWN **,而不是最近的,但是更好地改变你的问题的措辞以得到期望的结果。只需明确一点,以0.94结尾的数字将四舍五入为0.50,以0.49结尾的数字将四舍五入为0.95(也会导致整数数字的变化) – karakfa

+0

谢谢!我试了一下,并且它在这个例子中工作正常。但工作文件有40列。价格价格列在5日,价格必须添加在最后一列之后,所以在工作文件列41.然后它不工作,但我不明白为什么...... –

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的头becasue样本显示已经与价格的标题所以取一个你想
+0

您可以使用'printf': https://www.gnu.org/software/gawk/manual/html_node/Printf-Examples.html – Dan

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表示您需要小数点左边的两位数字和右边的两位数字。如果你说%4.2f,它会确保在小数点左边有足够的空间放置四位数字,并且留下空格填充数字。该\n到底是新线字符。

幸运的是,虽然printf起初很难理解,但几乎所有的编程语言都差不多。它在awk,Perl,Python,C,Java,以及更多的语言。并且,如果您需要的信息不在printf中,请尝试sprintf上的文档,它与printf类似,但将格式化的文本打印到字符串中。

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

相关问题