You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash中仅按第一列排序且保留相同键的原有顺序?

如何在Bash中按第一列稳定排序并保留原有相对顺序?

当然可以搞定!你遇到的其实是稳定排序的需求——当第一列的值相同时,要保持这些行在原始数据里的先后顺序。

默认的sort命令并不是稳定排序:当两行的排序键(这里是第一列)相同时,它会自动根据后续列的内容继续排序,这就是为什么你的例子里两个以5开头的行顺序被调换了。

方法一:用sort的稳定排序参数

现代的sort工具都支持-s参数来启用稳定排序,再搭配-k1,1指定只按第一列排序,就能完美满足需求。

假设你的数据存在文件data.txt里,原始内容是:

5 6
4 8
2 9
5 4

执行以下命令:

sort -s -k1,1 data.txt

得到的结果就是你想要的:

2 9
4 8
5 6
5 4

参数说明:

  • -s:开启稳定排序模式,确保相同排序键的行保持原始出现顺序
  • -k1,1:明确指定排序的范围是第1列到第1列,避免sort自动把后面的列也纳入排序判断

方法二:兼容老版本sort的替代方案

如果你的系统上的sort不支持-s参数(比如非常老的UNIX系统),可以通过给每行添加原始行号的方式间接实现稳定排序:

nl -ba -s' ' data.txt | sort -k2,2 -k1,1n | cut -d' ' -f2-

步骤拆解:

  1. nl -ba -s' ':给每一行加上连续的行号(用空格分隔行号和内容)
  2. sort -k2,2 -k1,1n:先按第二列(原数据的第一列)排序,再按第一列(行号)数字升序排序——这样相同原第一列的行会按行号顺序排列,也就是原始顺序
  3. cut -d' ' -f2-:去掉前面的行号,恢复原始的行内容

内容的提问来源于stack exchange,提问作者Roy Peled

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:27:08