19

AWKを使用して数値データの列の中央値を計算するにはどうすればよいですか?

私は単純なアルゴリズムを考えることができますが、それをプログラムすることはできないようです:

私がこれまでに持っているのは:

sort | awk 'END{print NR}' 

そして、これは私に列の要素の数を与えます。これを使って特定の行を印刷したいと思い(NR/2)ます。が整数でない場合NR/2は、最も近い整数に切り上げ、それが中央値です。それ以外の場合は、との平均を取り(NR/2)+1ます(NR/2)-1

4

5 に答える 5

24

awk最初の列を見ると仮定して、値を配列に格納し、最後に中央値を計算する必要があります。

sort -n file | awk ' { a[i++]=$1; } END { print a[int(i/2)]; }'

確かに、実際の中央値の計算では、質問で説明されているように丸めを行います。

sort -n file | awk ' { a[i++]=$1; }
    END { x=int((i+1)/2); if (x < (i+1)/2) print (a[x-1]+a[x])/2; else print a[x-1]; }'
于 2011-05-29T07:34:12.557 に答える
19

このawkプログラムは、数値的にソートされたデータの1つの列を想定しています。

#/usr/bin/env awk
{
    count[NR] = $1;
}
END {
    if (NR % 2) {
        print count[(NR + 1) / 2];
    } else {
        print (count[(NR / 2)] + count[(NR / 2) + 1]) / 2.0;
    }
}

使用例:

sort -n data_file | awk -f median.awk
于 2011-05-29T07:38:08.770 に答える
5

OK、このトピックを見て、過去に似たようなものを探していたので、2セント追加できると思いました。タイトルに「」と書いてありますがawk、すべての答えも活用しsortています。データの列の中央値の計算は、datamashを使用して簡単に実行できます。

> seq 10 | datamash median 1
5.5

sortソートされていない列がある場合でも、これは必要ないことに注意してください。

> seq 10 | gshuf | datamash median 1
5.5

ドキュメントには、実行できるすべての機能と、多くの列を持つファイルの良い例が記載されています。とにかく、それはとは何の関係もありませんがawk、このような場合に非常に役立つと思います。datamashまた、と組み合わせて使用​​することもできますawk。それが誰かを助けることを願っています!

于 2018-03-13T18:55:56.187 に答える
2

unix.stackexchange.comの同様の質問に対するこのAWKベースの回答は、中央値を計算するためのExcelと同じ結果を提供します。

于 2016-04-14T16:34:04.047 に答える
1

中央値を計算する配列がある場合(Johnsywebソリューションのワンライナーを含む):

array=(5 6 4 2 7 9 3 1 8) # numbers 1-9
IFS=$'\n'
median=$(awk '{arr[NR]=$1} END {if (NR%2==1) print arr[(NR+1)/2]; else print (arr[NR/2]+arr[NR/2+1])/2}' <<< sort <<< "${array[*]}")
unset IFS
于 2018-03-13T18:20:59.227 に答える