Укороченный вариант:AWK - округление до 2 знаков после запятой в подытогами
Есть ли способ сказать AWK округлять до 2 знаков после запятой в процессе консолидации, а не во время печати?
Длинная версия:
У меня есть входящий файл в формате ниже. Я должен получить чистые остатки на одну валюту, и если сеть не равна нулю, распечатайте результат в двух столбцах: нетто-балансы меньше нуля переходят в столбец neg_bal, а положительные остатки идут в столбец pos_bal. По какой-то причине, колонка USD по-прежнему печатается, несмотря на плетение нулю
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, я вижу, что сумма в долларах США не равна нулю. (Почему это, кстати? Даже первенствует дает сеть -1.59872E-14)
awk]$ ./scr1 file1
EUR|-11.90000000000000213163|0.00000000000000000000
USD|0.00000000000000000000|0.00000000000001243450
GBP|0.00000000000000000000|80.00000000000000000000
WRT «почему это» - потому что это вычисление с плавающей точкой, Google это. –