Bash 带awk的柱中间带

Bash 带awk的柱中间带,bash,sed,awk,median,Bash,Sed,Awk,Median,如何使用AWK计算一列数值数据的中值 我能想到一个简单的算法,但我似乎无法编程: 到目前为止,我得到的是: sort | awk 'END{print NR}' 这给了我列中元素的数量。我想用它来打印某一行(NR/2)。如果NR/2不是整数,那么我将四舍五入到最接近的整数,这就是中位数,否则我将取(NR/2)+1和(NR/2)-1的平均值,使用awk您必须将值存储在一个数组中,并在末尾计算中位数,假设我们查看第一列: sort -n file | awk ' { a[i++]=$1; } E

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

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

到目前为止,我得到的是:

sort | awk 'END{print NR}' 

这给了我列中元素的数量。我想用它来打印某一行
(NR/2)
。如果
NR/2
不是整数,那么我将四舍五入到最接近的整数,这就是中位数,否则我将取
(NR/2)+1
(NR/2)-1
的平均值,使用
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]; }'
sort-n文件| awk'{a[i++]=$1;}
结束{x=int((i+1)/2);如果(x<(i+1)/2)打印(a[x-1]+a[x])/2;否则打印a[x-1];}'

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

对于unix.stackexchange.com上的类似问题,在计算中值时给出与Excel相同的结果。

如果您有一个数组来计算中值(包含一行Johnsyweb解决方案):

array=(564279318)#数字1-9
IFS=$'\n'

中位数=$(awk'{arr[NR]=$1}END{if(NR%2==1)打印arr[(NR+1)/2];else打印(arr[NR/2]+arr[NR/2+1])/2}“好的,刚刚看到这个主题,我想我可以加上我的两分钱,因为我以前找过类似的东西。尽管标题上写着
awk
,但所有的答案都使用了
排序
。计算一列数据的中值可以很容易地通过以下方法完成:

请注意,即使有未排序的列,也不需要排序:

> seq 10 | gshuf | datamash median 1
5.5

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

您也可以使用
>asort
在awk内部对数组进行排序。@Vatine:确实可以。@Nick说他使用的是
排序
,所以我保持简单。@Vatine asort()是GNU awk特有的,会使代码更复杂。@RuudvA:如果数组是以零为基础的,那是真的,但是第一次
计数[NR]=$1;
被称为
NR==1
。我相信这段代码是正确的(但是,近五年后,我不喜欢将
计数
作为变量名)。我比较了性能和排序-kn3比awk{print$0 |“sort-nk3”}快得多(对于一个有100万行和3列的文件,这段时间是14秒,而66秒)。在计算中值之前进行排序是计算结果的更快方法。如前所述。
> seq 10 | datamash median 1
5.5
> seq 10 | gshuf | datamash median 1
5.5