AWK 每列的 RANK 值

RANK values per column with AWK

AWK 中是否有 RANK 函数可以对单个文本文件中每列的值进行 RANK(较高的值排在最前面)?期待这个:

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!=){ rank++; }
printf("%s\t%s\t%s\n",rank,,)
val=
} ' <(sort -k2 -nr Original.txt) > Results.txt

您可以尝试使用 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