在awk中计算排名?

在awk中计算排名?

我想计算 awk 中可能包含重复数字的数组的排名。

在 R 中,它看起来像这样。

R> x=c(92, 3, 1, 4, 15, 4)
R> rank(x)
[1] 6.0 2.0 1.0 3.5 5.0 3.5

Unix 下如何对数组中的数字进行排序?

这是不允许重复数字的解决方案。有人有 awk 函数来返回具有重复数字的数组的排名吗?

awk '
    FNR == NR {numbers[$1]=1; next} 
    FNR == 1 {
        n = asorti(numbers, sorted, "@ind_num_asc")
        for (i=1; i<=n; i++) rank[sorted[i]] = i
    }
    {print rank[$1]}
' file file

答案1

rankR 中函数在多重情况下的默认行为k似乎是对下一个进行平均kk-1排名(在此过程中使用额外的排名):

$ awk '
    FNR == NR {numbers[$1]++; next}
    FNR == 1 {
        n = asorti(numbers, sorted, "@ind_num_asc")
        for (i=1; i<=n; i++) {
            k = numbers[sorted[i]]; 
            rank[sorted[i]] = i + offset + (k-1)/2; 
            offset += (k-1)
        }
    }
    {print rank[$1]}
' file file
6
2
1
3.5
5
3.5

请注意,numbers[$1]=1已更改为 来numbers[$1]++记录多重性。

相关内容