はじめに
jq
コマンドで四捨五入するための四苦八苦を記載します。
環境
カテゴリ | バージョン |
---|---|
OS | Ubuntu 18.04(WSL 1) |
jqコマンド | jq-1.5-1-a5b5cbe (aptからインストール) |
aptでインストールできるjqコマンドは、普通に演算で使う、四捨五入のround
関数、切り上げのceil
関数が使えません。
$ echo '{"a":100,"b":8}' |jq '.a / .b'
12.5
$ echo '{"a":100,"b":8}' |jq '(.a / .b)|floor' #切り捨て
12
$ echo '{"a":100,"b":8}' |jq '(.a / .b)|round' # 四捨五入したい -> 13
jq: error: round/0 is not defined at <top-level>, line 1:
(.a / .b)|round
jq: 1 compile error
$ echo '{"a":100,"b":8}' |jq '(.a / .b)|ceil' #切り上げたい -> 13
jq: error: ceil/0 is not defined at <top-level>, line 1:
(.a / .b)|ceil
マニュアルによると「C言語ライブラリの関数は使える」という感じでしたが、使えない関数もあるようです。
Availability of standard math functions depends on the availability of the corresponding math functions in your operating system and C math library. Unavailable math functions will be defined but will raise an error.
というわけで、他の方法で回避します。
四捨五入する(round)
$ echo '{"a":100,"b":8}' |jq '(.a / .b) + 0.5 | floor' #100 / 8 = 12.5
13
切り上げる(ceil)
※JSONの演算結果が小数第一位までであることが前提のコードです
$ echo '{"a":100,"b":8}' |jq '(.a / .b) + 0.9 | floor' #100 / 8 = 12.5
13
テスト
# 四捨五入
$ echo '{"a":100,"b":8}' |jq '(.a / .b) - 0.1 + 0.5 | floor' # 12.5 - 0.1 = 12.4
12
$ echo '{"a":100,"b":8}' |jq '(.a / .b) + 0.5 + 0.5 | floor' # 12.5 + 0.5 = 13
13
# 切り上げ
$ echo '{"a":100,"b":8}' |jq '(.a / .b) -0.1 + 0.9 | floor' # 12.5 - 0.1 = 12.4
13
$ echo '{"a":100,"b":8}' |jq '(.a / .b) + 0.5 + 0.9 | floor' # 12.5 + 0.5 = 13
13
余談
検索してみると、jq
1.6なら対応しているとか、ディストリビューションによって使える関数が異なるとか、このあたりの議論が錯綜しているようです。
https://stackoverflow.com/questions/59063536/how-to-round-floor-ceil-truncate
(´-`).。oO(素直に公式のjqを使った方がいいかもしれません)