发布
社区首页 >问答首页 >当排序不知道排序顺序时,GNU排序稳定排序

当排序不知道排序顺序时,GNU排序稳定排序
EN

Unix & Linux用户
提问于 2019-07-30 01:51:54
回答 2查看 1.9K关注 0票数 17

我有一个两列文件;该文件已经按照我希望的方式在第1列上排序了。我想在第2栏中对每一栏第1类进行排序。但是,sort不理解第1列的排序顺序。

通常的方法(从堆栈中的类似问题)是这样的:

代码语言:javascript
代码运行次数:0
复制
sort --stable -k1,1 -k2,2n

但是我不能在k1上指定排序,因为它是任意的。

示例输入:

代码语言:javascript
代码运行次数:0
复制
C 2
C 1
A 2
A 1
B 2 
B 1

和产出:

代码语言:javascript
代码运行次数:0
复制
C 1
C 2
A 1
A 2
B 1 
B 2
EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2019-07-30 02:16:46

您可以使用awk为每个块启动一个新的排序:

代码语言:javascript
代码运行次数:0
复制
% awk -v cmd="sort -k2,2" '$1 != prev {close(cmd); prev=$1} {print | cmd}' foo
C 1
C 2
A 1
A 2
B 1
B 2
  • $1 != prev {close(cmd); prev=$1} -当保存的值不同时,我们有一个新块,因此我们关闭任何先前启动的sort
  • {print | "sort -k2,2"}'将输出管道传输到sort,如果它尚未运行,则启动它(awk可以跟踪它启动的命令)
票数 19
EN

Unix & Linux用户

发布于 2019-07-30 18:44:22

您可以使用一个施瓦茨变换 (这基本上是注释中提到的装饰-排序-取消修饰方法,但由于使用单个sort调用而不是多个调用,可能比D3 精确的答案更具有性能)--使用awk添加一个前缀列,它会随着第一列中值的变化而增加,按照前缀列后面的前缀列进行排序(由于前缀列的存在,序号位置暂时移动到3 ),并最终去掉前缀列。

代码语言:javascript
代码运行次数:0
复制
awk '{print ($1 in a? c+0: ++c)"\t" $0; a[$1]}' file | sort -k1,1n  -k3,3 | cut -f 2-
票数 12
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/532848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档