linux - 根据 bash 或 awk 中一行中的值对列重新排序

标签 linux bash awk

我有

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/

相关文章:

bash - 从文本文件中 Grep 多个字符串

bash - Awk 将双引号字符串视为一个标记并忽略其间的空格

shell - 如何使用 awk 在循环中打印列?

linux - 在 docker 容器中公开动态打开的端口

c++ - 如何在 C++ 中使用 pthread 将数据从一个线程传递到另一个正在运行的线程

linux - virtualbox 中的 Guest CentOS 无法加载 GNOME 电源管理器

linux - 比较两个文件 diff awk else

xml - 用于格式化 XML 文件并保留空行和注释的 CLI 工具

linux - 如何使用 shell 脚本在目录及其以数字或点开头的子目录中打印文本文件的数学行?

linux - 查找具有超过特定文件大小的特定扩展名的文件