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
答案 0 :(得分:0)
您可以尝试使用gawk
和asorti
函数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