【问题标题】:unix sort inconsistent with mixed numeric and non-numericunix排序与混合数字和非数字不一致
【发布时间】:2014-11-25 18:33:21
【问题描述】:

我在对包含这些行的文件 (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

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

排序 -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

相当于排序-nk3,3。 这些命令正确排序:

  • 排序 -k1,1 -k2,2 -k3,3
  • 排序 -nk1,1 -k2,3
  • 排序 -k2,2 -k3,3

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

在 linux 3.2.0-70-generic 和 osx 10.9.5 上转载。

【问题讨论】:

  • 预期输出是什么?
  • 排序不会做十六进制,你有“-n”作为所有字段的选项
  • 预期输出与开始相同 - 但问题在下面回答。

标签: sorting unix


【解决方案1】:

-n 是一个整体程序选项,不是任何键描述符的一部分,即使您以您的方式将它与键描述符物理结合。如果您只想对第一个键进行数字排序,那将是

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

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

【讨论】:

  • 谢谢 - 以某种方式编造一些语法感觉很愚蠢,但很高兴理解这种情况!
【解决方案2】:

数字排序选项不会处理十六进制表示,而是处理十六进制数字的字符串表示。正如约翰所提到的,您需要将“n”选项放在要按数字排序的字段上。

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

sort hex numbers of different length from the command line?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 2023-03-30
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多