当找不到字段时,sort 采用什么策略?

当找不到字段时,sort 采用什么策略?

我有一个名为 test 的文件,其内容如下

111 222
11 22
111 223
12 22 33
11 2 25
222 331
11 2
33 2 1
33
33 22 33

我用了:

sort -bk2.3 test

但结果让我很困惑,那些没有 k2.3 的行排序相当随机。我期望目标行都列在开头或结尾,但事实并非如此。它就像:

11 2
11 22
33
222 331
33 2 1
111 222
11 2 25
111 223
12 22 33
33 22 33

那么,对没有声明关键区域的线路进行排序的内部机制是什么呢?

答案1

我强烈推荐此 Stack Overflow 线程同一主题。这种行为并不直观,尽管研究了该线程和官方GNU 排序文档我无法确定当排序索引超出范围时会发生什么。

  1. 不过,我必须指出,您可以使用“b”修饰符作为排序键 opt,它会忽略该键中的空格,即空白键,例如

    $sort-k 2.3nb 测试

  2. 同样来自GNU 排序文档,很明显 -k 选项接受以下格式的参数起始位置结束位置如果没有结束位置指定它从你的起始位置比较键 直到当前行的末尾。这一点以及以下警告是导致未定义行为的原因。

    Finally, as a last resort when all keys compare equal, 
    sort compares entire lines as if no ordering options other 
    than --reverse (-r) were specified. 
    
  3. 您还可以指定多个键作为决胜局,但这并不能解决您的使用情况,因为它是导致不直观行为的第一个键。

  4. 最后,如果您的系统上有 GNU Sort 中可用的 --debug 选项,那么这将对故障排除非常有帮助,因为它可以揭示与关键模式匹配的内容。不幸的是,我没有,所以只能在黑暗中试验。

我不知道您的用例到底是什么,但我发现以下结果集相当令人满意。这种行为可能没有记录但显然按照我的直觉和您的要求工作:

$ sort -k 2.3nb,2 test
11 2
11 2 25
11 22
12 22 33
33
33 2 1
33 22 33
222 331
111 222
111 223

相关内容