unix排序与混合数字和非数字不一致

时间:2014-11-25 18:33:22

标签: sorting unix

我在排序包含这些行的文件(badsort.small)时出现问题:

0 foo 30
0 foo/bar 26
0 foo/bar 2b
0 foo/bar 30
0 foo/bar 73
0 foo/bar 91
0 foo/bar d3

以下排序给出奇怪的结果:

sort -nk1,1 -k2,2 -k3,3 badsort.small

0 foo/bar d3
0 foo/bar 2b
0 foo/bar 26
0 foo 30
0 foo/bar 30
0 foo/bar 73
0 foo/bar 91

等同于sort -nk3,3。 这些命令正确排序:

  • sort -k1,1 -k2,2 -k3,3
  • sort -nk1,1 -k2,3
  • sort -k2,2 -k3,3

这个请求是什么导致错误的参数变成数字并占优势?有没有办法避免它?我以编程方式生成排序参数,虽然我可以在这种情况下组合相邻的字段,但我并不相信我会再次遇到这种情况。

在linux 3.2.0-70-generic和osx 10.9.5上重现。

2 个答案:

答案 0 :(得分:2)

-n是一个整体程序选项,不是任何键描述符的一部分,即使你以你的方式将它与键描述符进行物理组合也是如此。如果您只希望第一个键按数字排序,那么这将是

sort -k1,1n -k2,2 -k3,3

实际上产生了与输入相同的顺序。

答案 1 :(得分:0)

数字排序的选项不会处理十六进制表示,并且可以处理十六进制数字的字符串表示。正如约翰所提到的,你需要在你想要数字排序的字段上放置“n”选项。

如果您想以数字方式对十六进制字段进行排序:

sort hex numbers of different length from the command line?