我在列中有一个充满数据的文件
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命令,但只能找到垂直排序,而不是水平排序.我很高兴使用任何工具,任何帮助表示赞赏.谢谢!
让我们创建一个转置文件的函数(使行成为列,列成为行):
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)