Linux 用bash计算五分位数
如何从csv文件计算五分位数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
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