我有

200 34  323 160
0.3 0.6 0.5 0.2
0.4 0.9 0.7 0.9

和需要
34  160 200 323
0.6 0.2 0.3 0.5
0.9 0.9 0.4 0.7

……按第一行中的值排序的列。在猛击或惊吓中。听起来很简单但是..

最佳答案

awk 'NR==1 {for (i=1; i<=NF; i++) {print $i " " i} }' inputfilename >headers.txt
sort -k1,1n headers.txt >headerssort.txt
awk 'NR==FNR {a[NR]=$2} NR!=FNR {for (i=1; i<NF; i++) {printf $a[i] " "}; print $a[NF]}' headerssort.txt inputfilename >outputfilename

实际上,您要做的是创建临时文件headers.txt,该文件将输入文件(inputfilename)的第一行中的所有值打印在单独的行上,再加上该值(列号)在输入文件中的位置。然后根据该值对该文件进行排序(当然仍保留原始列号),并获得headerssort.txt文件。最后,使用这个排序文件以正确的顺序打印列,得到所需的文件(outputfilename)。

关于linux - 根据bash或awk中一行的值对列重新排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27516301/

10-12 02:58