使用AWK对每列的值进行排序
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对每列的值进行排序,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 ' {
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
aawk
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