AWK + gsub - как округлить плавающее число - PullRequest
1 голос
/ 28 февраля 2020

У вас есть представление о том, как я могу округлить числа с плавающей точкой после умножения?

У меня есть следующий SQL dump:

INSERT INTO
   `honzavolfcz_product` (`product_id`, `feed_product_id`, `import_id`,
   `import_active_product`, `model`, `sku`, `upc`, `ean`, `jan`, `isbn`, `mpn`,
   `location`, `quantity`, `stock_status_id`, `product_status_id`, `image`,
   `manufacturer_id`, `shipping`, `price`, `points`, `tax_class_id`,
   `date_available`, `weight`, `weight_class_id`, `length`, `width`, `height`,
   `length_class_id`, `subtract`, `minimum`, `sort_order`, `status`, `date_added`,
   `date_modified`, `viewed`) 
VALUES ('10', '0', '1',
   '1', 'model', '', '', '', '', '', '',
   '', '1', '1', '0', 'catalog/zbozi/bozi_laska_obal.jpg',
   '0', '1', '**112.50**', '0', '1',
   '2019-01-15', '0.00', '1', '0.00', '0.00', '0.00',
   '1', '0', '1', '0', '1', '2019-02-15 16:16:29',
   '2019-02-15 16:16:29', '293');

И я хочу умножить значение цены (112.50) на 1,21 (налоги) и округление вверх или вниз. Я написал следующую команду, которая выполняет умножение, но я не знаю, как его округлить:

awk '{a=substr($58,2,length($58)-3);gsub(a,a*1.21);print}' a > b

Результат:

INSERT INTO
   `honzavolfcz_product` (`product_id`, `feed_product_id`, `import_id`,
   `import_active_product`, `model`, `sku`, `upc`, `ean`, `jan`, `isbn`, `mpn`,
   `location`, `quantity`, `stock_status_id`, `product_status_id`, `image`,
   `manufacturer_id`, `shipping`, `price`, `points`, `tax_class_id`,
   `date_available`, `weight`, `weight_class_id`, `length`, `width`, `height`,
   `length_class_id`, `subtract`, `minimum`, `sort_order`, `status`, `date_added`,
   `date_modified`, `viewed`) 
VALUES ('10', '0', '1',
   '1', 'model', '', '', '', '', '', '',
   '', '1', '1', '0', 'catalog/zbozi/bozi_laska_obal.jpg',
   '0', '1', '**136.125**', '0', '1',
   '2019-01-15', '0.00', '1', '0.00', '0.00', '0.00',
   '1', '0', '1', '0', '1', '2019-02-15 16:16:29',
   '2019-02-15 16:16:29', '293');

Я хотел бы иметь 136 вместо 136,125 , Конечно, 137, если это будет 136,555.

Заранее спасибо.

1 Ответ

1 голос
/ 28 февраля 2020

Это может быть то, что вы хотите:

$ awk '{a=substr($58,2); $58=sprintf("\047%d\047,",a*1.21)} 1' file
INSERT INTO honzavolfcz_product (product_id, feed_product_id, import_id, import_active_product, model, sku, upc, ean, jan, isbn, mpn, location, quantity, stock_status_id, product_status_id, image, manufacturer_id, shipping, price, points, tax_class_id, date_available, weight, weight_class_id, length, width, height, length_class_id, subtract, minimum, sort_order, status, date_added, date_modified, viewed) VALUES ('10', '0', '1', '1', 'model', '', '', '', '', '', '', '', '1', '1', '0', 'catalog/zbozi/bozi_laska_obal.jpg', '0', '1', '136', '0', '1', '2019-01-15', '0.00', '1', '0.00', '0.00', '0.00', '1', '0', '1', '0', '1', '2019-02-15 16:16:29', '2019-02-15 16:16:29', '293');

, но округление, вероятно, не будет go вполне так, как вы хотели бы по умолчанию. См. https://www.gnu.org/software/gawk/manual/gawk.html#Round -Функция и https://www.gnu.org/software/gawk/manual/gawk.html#Setting -круглый режим , чтобы узнать, как управлять им с помощью GNU awk.

...