Unix中的中值计算

Unix中的中值计算,unix,awk,Unix,Awk,我需要为下面的输入文件计算中值。它适用于奇数出现,但不适用于偶数出现。下面是输入文件和使用的脚本。请您检查一下这个命令有什么问题,并加以纠正 输入文件: col1,col2 AR,2.52 AR,3.57 AR,1.29 AR,6.66 AR,3.05 AR,5.52 期望输出: AR,3.31 Unix命令: cat test.txt | sort -t"," -k2n,2 | awk '{arr[NR]=$1} END { if (NR%2==1) print arr[(NR+1)/2]

我需要为下面的输入文件计算中值。它适用于奇数出现,但不适用于偶数出现。下面是输入文件和使用的脚本。请您检查一下这个命令有什么问题,并加以纠正

输入文件:

col1,col2
AR,2.52
AR,3.57
AR,1.29
AR,6.66
AR,3.05
AR,5.52
期望输出:

AR,3.31
Unix命令:

cat test.txt | sort -t"," -k2n,2 | awk '{arr[NR]=$1} END { if (NR%2==1) print arr[(NR+1)/2]; else print (arr[NR/2]+arr[NR/2+1])/2}'

不要忘记,您的输入文件还有一行,包含标题。您需要在awk脚本中执行额外的步骤来跳过第一行

此外,由于您使用的是默认字段分隔符,
$1
将包含整行,因此您的代码
arr[NR/2]+arr[NR/2+1])/2
永远不会工作。我建议您更改它,以便awk以逗号分隔输入,然后使用第二个字段
$2

sort -t, -k2n,2 file | awk -F, 'NR>1{a[++i]=$2}END{if(i%2==1)print a[(i+1)/2];else print (a[i/2]+a[i/2+1])/2}'
我还删除了你对猫的无用使用。大多数工具,包括sort和awk,都能够直接读取文件,所以不需要使用cat

测试它:

$ cat file
col1,col2
AR,2.52
AR,3.57
AR,1.29
AR,6.66
AR,3.05
AR,5.52
$ sort -t, -k2n,2 file | awk -F, 'NR>1{a[++i]=$2}END{if(i%2==1)print a[(i+1)/2];else print (a[i/2]+a[i/2+1])/2}'
3.31

稍微修改脚本以将输出更改为您想要的任何内容应该不会太困难。

这应该可以工作
awk-F,'NR>1{a[++x]=$2}END{asort(a);print(x%2)?a[(x/2)+0.5]:(a[x/2]+a[(x/2)+1])/2}'
使用脚本语言。像“2.52e-3”这样的浮点数将打破你的字典排序。