对于我们的网上商店,我们从制造商处获得包含产品数据的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
答案 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
答案 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)
不知道你的程序是什么样子,很难给你更多的信息。
但是,awk
和bash
都有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
起初很难理解,但几乎所有的编程语言都几乎相同。它位于awk
,Perl
,Python
,C
,Java
以及更多语言中。而且,如果您需要的信息不在printf
中,请尝试使用sprintf
上的文档printf
,但将格式化文本打印为字符串。
我见过的最好的文档是Perl sprintf
documentation,因为它给了你很多例子。