我有
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
.. 列按第一行中的值排序。在 bash 或 awk 中。听起来很简单但是..
最佳答案
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/