⛄️
jqで最大値・最小値・平均値・中央値を求める
概要
数値の配列を入力として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
番目の値を取得します。
n
はlength
関数で取得した配列の長さに中央となる0.5
をかけた値から1
を引いて求めます。
1
を引いているのはnth
関数の引数が0
オリジンなためです。
seq 100 | jq -s 'sort | nth(length * 0.5 - 1)'
かける数値を0.9
にすれば90パーセンタイル値、0.95
にすれば95パーセンタイル値を求められます。
Discussion