简短版本:
有没有办法告诉awk在合并期间舍入到2位小数,而不是在打印期间?
长版:
我有一个传入的文件,格式如下。我应该得到每种货币的净余额,如果净值不为零,则将结果打印在两列中:净余额小于零转到neg_bal列,正余额转到pos_bal列。出于某种原因,尽管净值为零,仍然会打印美元列
JPY||170
JPY||40
USD|-42.61|
USD|-166.27
USD||42.61|
GBP|-20|
EUR||18.7
USD||174.6|
USD|-8.33||
EUR|-30.6|
GBP||100
JPY|-210|
以下是使用的代码:
#!/bin/awk -f
BEGIN {
FS="|";
}
{
bal[$1]+=$2+$3
ccy[$1]=$1
}
END {
for (i in ccy)
{
if (bal[i] >0 )
{
pos_bal = bal[i]
neg_bal = 0
}
else
{
neg_bal = bal[i]
pos_bal = 0
}
if (bal[i] != 0 )
{
printf "%s|%.2f|%.2f\n",ccy[i],neg_bal,pos_bal
}
}
}
结果(注意JPY没有显示,因为它的网络为零):
awk]$ ./scr1 file1
EUR|-11.90|0.00
USD|0.00|0.00
GBP|0.00|80.00
如果我将小数位数增加到20,我看到美元净额实际上并非为零。 (为什么这样,顺便说一下?甚至excel给出净值-1.59872E-14)
awk]$ ./scr1 file1
EUR|-11.90000000000000213163|0.00000000000000000000
USD|0.00000000000000000000|0.00000000000001243450
GBP|0.00000000000000000000|80.00000000000000000000
答案 0 :(得分:4)
有没有办法告诉awk在期间舍入到2位小数 合并,而不是在印刷过程中?
是:乘以100并转换为int。然后在准备打印时除以100。
(换句话说,算上便士而不是美元。)