2014-10-09 2 views
0

Укороченный вариант: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 
+1

WRT «почему это» - потому что это вычисление с плавающей точкой, Google это. –

ответ

3

Есть ли способ сказать AWK округлять до 2 знаков после запятой во время консолидации, а не во время печати ?

Да: умножить на 100 и преобразовать в int. Затем разделите на 100, когда вы будете готовы к печати.

(Другими словами, считать гроши вместо долларов.)

+0

Так просто. Благодарю. – masterl

Смежные вопросы