使用AWK对每列的值进行排序

使用AWK对每列的值进行排序,awk,rank,Awk,Rank,AWK中是否有一个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 原始结果 B C结果\u A结果\u B结果\u C

AWK中是否有一个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 原始结果 B C结果\u A结果\u B结果\u 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
awk'{
如果(val!=$2){rank++;}
printf(“%s\t%s\t%s\n”,排名,$1,$2)
瓦尔=2美元
}'Results.txt

您可以尝试使用
gawk
asorti
功能


为什么
Result_C
具有顺序
1 2 1
,根据
4 3 4
,它不应该是
1 3 2
?@RomanPerekhrest原始列C的值为4 3 4,其中4(重复)是较高的值,因此应排在前1位,值3应为2。希望这能说明问题,里卡多,你试过了吗?嗯,第3行出现语法错误,第16行出现非法语句。@user2150845我使用
gnuawk
a
awk
flavor。。。。。我在第一段说的里卡多,你完全正确。工作完美!谢谢
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