使用AWK的每列RANK值

时间:2017-02-15 18:28:31

标签: awk rank

AWK中是否存在RANK函数,在单个文本文件中每列RANKs值(更高的值排在最前面)?期待这个:

Original       Results
A  B  C     Result_A  Result_B Result_C
8  5  4     1          2          1
4  7  3     2          1          2
2  3  4     3          3          1

我正在使用此AWK脚本,但只对一列进行排名。谁能引导我走向正确的方向?非常感谢。

awk ' {
if(val!=$2){ rank++; }
printf("%s\t%s\t%s\n",rank,$1,$2)
val=$2
} ' <(sort -k2 -nr Original.txt) > Results.txt

1 个答案:

答案 0 :(得分:0)

您可以尝试使用gawkasorti函数Array-Sorting-Functions

awk 'BEGIN{OFS="\t"}
    NR==1{
        for(i=1; i<=NF; ++i) printf "Result_%s%s", $i, i==NF?ORS:OFS 
        next
    }
    { for(i=1; i<=NF; ++i) M[i, NR-1]=$i }
    END{
        for(i=1; i<=NF; ++i){
            delete d;
            for(j=1; j<=NR-1; ++j) d[M[i,j]]
            n = asorti(d, idx)
            for(j=1; j<=n; ++j) rank[i, idx[j]] = n-j+1
        }
        for(j=1; j<=NR-1; ++j)
            for(i=1; i<=NF; ++i)
                printf "%s%s", rank[i, M[i,j]], i==NF?ORS:OFS
    }
' original

你明白了,

Result_A    Result_B    Result_C
1   2   1
2   1   2
3   3   1