⛄️
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