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