使用bash水平排序数据

sma*_*sma 3 sorting bash

我在列中有一个充满数据的文件

sarah mark john
10    20   5
x     y    z 
Run Code Online (Sandbox Code Playgroud)

我想对数据进行排序,以便列保持不变,但第二行按递增顺序排列,所以它看起来像这样:

john sarah mark
5    10    20 
z    x     y 
Run Code Online (Sandbox Code Playgroud)

我一直在看sort命令,但只能找到垂直排序,而不是水平排序.我很高兴使用任何工具,任何帮助表示赞赏.谢谢!

fed*_*qui 7

让我们创建一个转置文件的函数(使行成为列,列成为行):

transpose () {
  awk '{for (i=1; i<=NF; i++) a[i,NR]=$i; max=(max<NF?NF:max)}
        END {for (i=1; i<=max; i++)
              {for (j=1; j<=NR; j++) 
                  printf "%s%s", a[i,j], (j<NR?OFS:ORS)
              }
        }'
}
Run Code Online (Sandbox Code Playgroud)

这只是将所有数据加载到一个二维数组中a[line,column],然后将其打印回来a[column,line],以便它转置给定的输入.包装器transpose () { }用于将其存储为bash函数.您只需要将其粘贴到shell中(或者~/.bashrc如果您希望它是一个永久性函数,可以在任何时候打开会话时使用).

然后,通过使用它,我们可以通过使用sort -n -k2:基于第2列数字排序来轻松解决问题.然后,转置回来.

$ cat a | transpose | sort -n -k2 | transpose
john sarah mark
5 10 20
z x y
Run Code Online (Sandbox Code Playgroud)

如果你想要一个漂亮的格式作为最终输出,只需管道column这样:

$ cat a | transpose | sort -n -k2 | transpose | column -t
john  sarah  mark
5     10     20
z     x      y
Run Code Online (Sandbox Code Playgroud)

一步步:

$ cat a | transpose 
sarah 10 x
mark 20 y
john 5 z
$ cat a | transpose | sort -n -k2
john 5 z
sarah 10 x
mark 20 y
$ cat a | transpose | sort -n -k2 | transpose 
john sarah mark
5 10 20
z x y
Run Code Online (Sandbox Code Playgroud)