我有一个列中充满数据的文件
sarah mark john
10 20 5
x y z
我想对数据进行排序,使列保持完整,但第二行是按递增顺序排列的,因此如下所示:
john sarah mark
5 10 20
z x y
我一直在查看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)
}
}'
}
这只是将所有数据加载到一个二维数组
a[line,column]
中,然后将其打印回a[column,line]
,以便它对给定的输入进行转置。包装器transpose () { }
用于将其存储为bash函数。您只需要将其复制粘贴到shell中(或者如果您希望它是一个永久函数,则可以在打开会话时使用)。然后,通过使用它,我们可以使用
~/.bashrc
:基于列2的数字排序来轻松解决问题。然后,调换回来。$ cat a | transpose | sort -n -k2 | transpose
john sarah mark
5 10 20
z x y
如果您希望有一个好的格式作为最终输出,只需使用如下管道:
$ cat a | transpose | sort -n -k2 | transpose | column -t
john sarah mark
5 10 20
z x y
一步一步地:
$ 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