Версия awk, которая не заботится о значениях, а о месте при сортировке по значению. Quintilies определены на более ранней версии вашего вопроса:
awk '
BEGIN {
FS=OFS=","
}
{
a[NR]=$0
}
END {
for(i=1;i<=int(0.2*NR);i++)
b[i]=1
for(;i<=(0.4*NR);i++)
b[i]=2
for(;i<=(0.6*NR);i++)
b[i]=3
for(;i<=(0.8*NR);i++)
b[i]=4
for(;i<=NR;i++)
b[i]=5
for(i=1;i<=NR;i++)
print a[i],b[i]
}' <(sort -t, -k3n file)
Вывод:
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)
С GNU awk вы можете определить PROCINFO["sorted_in"]="@val_num_asc"
и потерять sort
. Вывод для последней версии набора данных OP:
1,1
1,1
2,2
4,3
6,3
9,4
15,4
30,5
90,5