⛄️

jqで最大値・最小値・平均値・中央値を求める

2022/03/01に公開

概要

数値の配列を入力としてjqコマンドで最大値・最小値・平均値・中央値の求め方を記載します。

まず結論

1から100の整数からなる配列を例にjqコマンドと得られた結果を記載します。

最大値。

seq 100 | jq -s max
結果
100

最小値。

seq 100 | jq -s min
結果
1

平均値

seq 100 | jq -s 'add/length'
結果
50.5

中央値。

seq 100 | jq -s 'sort | nth(length * 0.5 - 1)'
結果
50

解説

-sオプション

各値の求め方を解説する前に-sオプションへ言及しておきます。
-sオプションは全ての入力値を1つの配列に詰め込んで扱えます。

echo 1 2 3 | jq -s
結果
[
  1,
  2,
  3
]

もちろん数値以外の値でも使えます。

echo '"hello" 123 true {"foo":"bar"} ["baz", "qux"]' | jq -s 
結果
[
  "hello",
  123,
  true,
  {
    "foo": "bar"
  },
  [
    "baz",
    "qux"
  ]
]

前述の例では1から100の整数からなる配列をインプットとしましたが、この配列を得るためにseqコマンドと(jqコマンドの)-sオプションを使用しました。

最大値・最小値

最大値と最小値は単にmax関数とmin関数を使用します。

seq 100 | jq -s max
seq 100 | jq -s min

平均値

平均値を求める関数は無いようなので、add関数で合計値を算出して、それをlength関数で取得した配列の長さで割ります。

seq 100 | jq -s 'add/length'

中央値

中央値を求める関数も無いみたいです。
そのため、配列をsort関数で昇順に並べてnth関数n番目の値を取得します。
nlength関数で取得した配列の長さに中央となる0.5をかけた値から1を引いて求めます。
1を引いているのはnth関数の引数が0オリジンなためです。

seq 100 | jq -s 'sort | nth(length * 0.5 - 1)'

かける数値を0.9にすれば90パーセンタイル値、0.95にすれば95パーセンタイル値を求められます。

Discussion