Linux 用bash计算五分位数

Linux 用bash计算五分位数,linux,bash,shell,unix,Linux,Bash,Shell,Unix,如何从csv文件计算五分位数 6 2 15 90 9 1 4 30 1 输出: 6,3 2,2 15,4 90,5 9,4 1,1 4,3 30,5 1,1 k,l,1,1 q,r,1,2 < this differs c,d,2,2 m,n,4,3 a,b,6,3 i,j,9,4 e,f,15,4 o,p,30,5 g,h,90,5 下面是一个shell脚本,它使用sqlite3通过其ntile()窗口函数计算五分位数,该函数将值分成给定数量的组: #!/bin/sh pr

如何从csv文件计算五分位数

6
2
15
90
9
1
4
30
1
输出:

6,3
2,2
15,4
90,5
9,4
1,1
4,3
30,5
1,1
k,l,1,1
q,r,1,2     < this differs
c,d,2,2
m,n,4,3
a,b,6,3
i,j,9,4
e,f,15,4
o,p,30,5
g,h,90,5

下面是一个shell脚本,它使用sqlite3通过其
ntile()
窗口函数计算五分位数,该函数将值分成给定数量的组:

#!/bin/sh
printf "%s\n" \
       "CREATE TABLE data(a, b, c INTEGER);" \
       ".import '$1' data" \
       "SELECT a, b, c, ntile(5) OVER (ORDER BY c) FROM data ORDER BY rowid;" |
    sqlite3 -csv -batch -noheader
例如:

$ ./quintile.sh input.csv
a,b,6,3
c,d,2,2
e,f,15,4
g,h,90,5
i,j,9,3
k,l,1,1
m,n,4,2
o,p,30,4
q,r,1,1

(这需要
sqlite3
version 3.25或更高版本)

一个awk版本,它不关心值,只关心按值排序时的位置。五分位数的定义是


欢迎来到SO。这看起来像是家庭作业问题。请分享到目前为止你尝试过什么?
k,l,1,1
q,r,1,2     < this differs
c,d,2,2
m,n,4,3
a,b,6,3
i,j,9,4
e,f,15,4
o,p,30,5
g,h,90,5
$ awk '
BEGIN {
    FS=OFS=","
}
{
    a[NR]=$0                     # hash all values index on order #
}
END {                            # after all values are hashed
    for(i=1;i<=NR;i++) {         # loop thru them all 
        j+=(i>j*0.2*NR&&a[i]!=p) # figuring out current quintile
        print a[i],j             # output
        p=a[i]
    }
}' <(sort -n file)
1,1
1,1
2,2
4,3
6,3
9,4
15,4
30,5
90,5