Linux 如果coreutils排序中的数值相等,是否保留原始顺序?
考虑一下这个片段:Linux 如果coreutils排序中的数值相等,是否保留原始顺序?,linux,bash,sorting,gnu-coreutils,Linux,Bash,Sorting,Gnu Coreutils,考虑一下这个片段: echo '7 a 3 c 3 b 2 first 2 second 2 third 2 fourth 2 fifth 9 d 2 sixth ' | sort -n -k 1 它的输出为: 2 fifth 2 first 2 fourth 2 second 2 sixth 2 third 3 b 3 c 7 a 9 d 虽然列表按第一个字符的数字键正确排序,但对于那些连续且相等的值,原始顺序已被洗牌。我想获得: 2 first 2 second 2 third 2 fo
echo '7 a
3 c
3 b
2 first
2 second
2 third
2 fourth
2 fifth
9 d
2 sixth
' | sort -n -k 1
它的输出为:
2 fifth
2 first
2 fourth
2 second
2 sixth
2 third
3 b
3 c
7 a
9 d
虽然列表按第一个字符的数字键正确排序,但对于那些连续且相等的值,原始顺序已被洗牌。我想获得:
2 first
2 second
2 third
2 fourth
2 fifth
2 sixth
3 c
3 b
7 a
9 d
这可以通过
排序实现吗?如果没有,使用shell工具实现这种排序的最简单方法是什么?您正在寻找一种“稳定”的排序。尝试排序-s
选项(最好是检查系统的手册页)。只需添加-s
(稳定排序)标志,这将禁用最后的比较
echo '7 a
3 c
3 b
2 first
2 second
2 third
2 fourth
2 fifth
9 d
2 sixth
' | sort -k 1,1n -s
2 first
2 second
2 third
2 fourth
2 fifth
2 sixth
3 c
3 b
7 a
9 d
使用nl
添加行号,管道至sort-k2,1
以使用行号作为辅助键,然后使用cut
切断行号。或者使用排序-s
:p非常感谢,@1_CR-我确实注意到主页中的“最后手段比较”措辞,因为我觉得这听起来很奇怪-我一次也没有想到它与此相关!感谢您的片段-干杯!除了-s
,您还需要将您的钥匙指定为-k1,1
,因为KEYDEF是启动和停止位置的F[.C][OPTS][,F[.C][OPTS]]<代码>和停止位置默认为线的末端
。因此,如果指定-k1
,则整个字符串将用于排序。您可以使用--debug
查看每行中用于排序的部分。@benediktkoppel。FixesMany感谢jdigital——你是第一个,但我更欣赏@1_CR答案中的剪贴;我查看了手册页,但我不知道“禁用最后手段比较”与此相关。干杯“非常感谢,”阿玛丹-起初,我想“什么?”;然后我意识到这是一个聪明的诡计。
:)
欣赏幽默——干杯!