我有一个两列文件;该文件已经按照我想要的方式在第 1 列进行了排序。我想在每个第 1 列类别中对第 2 列进行排序。但是,sort
不了解第 1 列的排序顺序。
正常的方式(来自堆栈上的类似问题)是这样的:
sort --stable -k1,1 -k2,2n
但我不能指定 k1 的排序,因为它是任意的。
示例输入:
C 2
C 1
A 2
A 1
B 2
B 1
和输出:
C 1
C 2
A 1
A 2
B 1
B 2
我有一个两列文件;该文件已经按照我想要的方式在第 1 列进行了排序。我想在每个第 1 列类别中对第 2 列进行排序。但是,sort
不了解第 1 列的排序顺序。
正常的方式(来自堆栈上的类似问题)是这样的:
sort --stable -k1,1 -k2,2n
但我不能指定 k1 的排序,因为它是任意的。
示例输入:
C 2
C 1
A 2
A 1
B 2
B 1
和输出:
C 1
C 2
A 1
A 2
B 1
B 2
您可以使用 awk 为每个块开始新的排序:
$1 != prev {close(cmd); prev=$1}
- 当保存的值不同时,我们有一个新块,所以我们关闭任何以前启动的sort
{print | "sort -k2,2"}'
将输出通过管道传输到sort
,如果它尚未运行则启动它(awk 可以跟踪它启动的命令)您可以使用Schwartzian 变换(这基本上是您在评论中提到的 decorate-sort-undecorate 方法,但由于使用单个调用而不是多个调用,因此可能比muru 的 好答案更高效) - 使用添加前缀列随着第一列中值的变化而递增,按前缀列排序,然后是“第二”列(由于前缀列的存在,其序号位置暂时转移到),最后去掉前缀列
sort
awk
3