如何获取文件中排序值的中位数?

Cat*_*ina -2 bash awk

假设我的文件对数字进行了排序,如下所示:

1
22
36
45
53
Run Code Online (Sandbox Code Playgroud)

我希望能够获得 36。另一方面,如果文件的行数为偶数,例如:

1
22
36
45
53
67
Run Code Online (Sandbox Code Playgroud)

我想要平均值 (36+45)/2。

我想我当然可以使用 wc 来获取行数并处理中间的行。但是有没有更优雅的方法来获得中位数?

Soc*_*owi 5

使用专门为该工作设计的工具,例如 GNU datamash:

$ seq 5 | datamash median 1
3
$ seq 6 | datamash median 1
3.5
Run Code Online (Sandbox Code Playgroud)


kar*_*kfa 5

这是一个awk版本,没有那么优雅datamash

$ seq 6 | awk '{a[NR]=$1} END{m=int(NR/2)+1; print (NR%2?a[m]:(a[m-1]+a[m])/2)}'
3.5
Run Code Online (Sandbox Code Playgroud)