具有awk的列的中值

Nic*_*ick 14 bash awk sed median

如何使用AWK计算一列数值数据的中位数?

我可以想到一个简单的算法,但我似乎无法编程:

到目前为止我所拥有的是:

sort | awk 'END{print NR}' 
Run Code Online (Sandbox Code Playgroud)

这给了我列中元素的数量.我想用它来打印某一行(NR/2).如果NR/2不是整数,那么我向上舍入到最接近的整数,这是中位数,否则我取平均值(NR/2)+1(NR/2)-1.

Joh*_*web 18

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

样品用法:

sort -n data_file | awk -f median.awk
Run Code Online (Sandbox Code Playgroud)

  • 你也可以在awk里面使用`asort`来排序数组. (2认同)
  • @Vatine asort()特定于GNU-awk,会使代码更复杂一些. (2认同)

max*_*zig 17

随着awk你要的值存储在数组中,并在年底计算中位数,假设我们看看第一列:

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

当然,对于实际中值计算,请按照问题中的描述进行舍入:

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]; }'
Run Code Online (Sandbox Code Playgroud)


Vin*_*cco 5

好的,刚刚看到这个主题,我想我可以添加我的两分钱,因为我过去寻找过类似的东西。尽管标题说,所有答案也都有awk用。使用datamashsort可以轻松计算一列数据的中位数:

> seq 10 | datamash median 1
5.5
Run Code Online (Sandbox Code Playgroud)

请注意sort,即使您有未排序的列,也不需要这样做:

> seq 10 | gshuf | datamash median 1
5.5
Run Code Online (Sandbox Code Playgroud)

该文档提供了它可以执行的所有功能,以及具有多列的文件的良好示例。不管怎样,它与 无关awk,但我认为datamash在这种情况下有很大帮助,并且也可以与 结合使用awk。希望它对某人有帮助!