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

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

07-24 09:51
查看更多