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程序假定一列按数字排序的数据:

#/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

好的,刚看到这个话题,我想我可以加两分钱,因为我过去找过类似的东西。即使标题说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

这个基于 AWK对 unix.stackexchange.com 上类似问题的回答给出了与 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 回答