一个例子:
输入:
3739 99992076288 131072
3739 99996401664 202144
3739 10000649420 331072
3739 00000649420 231072
3738 99996401664 231072
需求:按照第一个字段排序,相等情况下保持原顺序不变。
期望输出:
3738 6401664 231072
3739 2076288 131072
3739 6401664 202144
3739 1649420 331072
3739 0649420 231072
shell 命令:sort -k1,1
输出如下:
3738 6401664 231072
3739 0649420 231072
3739 1649420 331072
3739 2076288 131072
3739 6401664 202144
结果分析:sort的结果不符合预期,在3739相等时,<3739 2076288 131072>应该在<3739 1649420 331072>前面,但是shell运行的结果却发生了改变,即不是稳定排序。
何为稳定排序:
相关介绍:shell sort 最后一列排序_十大经典排序算法(一)_weixin_39584549的博客-CSDN博客
Linux shell的sort排序功能十分强大,通过man sort内容如下:
因此,要想得到稳定的排序结果,需要追加-s
另外一个资料:
Linux sort命令中文手册(info sort翻译)_Linux教程_Linux公社-Linux系统门户网站
sort排序规则为:按照命令行中给定的字段顺序对给定的字段进行排序,排序时根据为每个字段分配的排序选项进行排序,直到发现不同的排序选项或者排序列结束。如果没有给定排序key(注:key即为-k指定的值),则对整行进行排序。最后,如果所有给定的key的比较结果都相等时,将对整行进行完全默认的排序(注:即以字母升序排序),但"-r"可以改变这次的升、降序结果。这次排序称为"最后的排序"。使用"-s"选项可以禁止"最后的排序",使得那些排序结果相同的行保留最初的相对顺序。"-u"选项同样也会禁止"最后的排序"。
通过上面的资料,应该是sort按照字段排序完成后,然后又对指定排序字段相等的行,进行了一次整行的默认(升序)排序,导致结果不符合预期,因此要想实现稳定排序,则需要禁止这最后一次排序,即增加 -s。
修正:sort -k1,1 -s
3738 6401664 231072
3739 0649420 231072
3739 1649420 331072
3739 2076288 131072
3739 6401664 202144
符合预期。