如何在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-
步骤拆解:
nl -ba -s' ':给每一行加上连续的行号(用空格分隔行号和内容)sort -k2,2 -k1,1n:先按第二列(原数据的第一列)排序,再按第一列(行号)数字升序排序——这样相同原第一列的行会按行号顺序排列,也就是原始顺序cut -d' ' -f2-:去掉前面的行号,恢复原始的行内容
内容的提问来源于stack exchange,提问作者Roy Peled
相关产品推荐
相关产品推荐

