我有一个名为 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 排序文档我无法确定当排序索引超出范围时会发生什么。
不过,我必须指出,您可以使用“b”修饰符作为排序键 opt,它会忽略该键中的空格,即空白键,例如
$sort-k 2.3nb 测试
同样来自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.
您还可以指定多个键作为决胜局,但这并不能解决您的使用情况,因为它是导致不直观行为的第一个键。
最后,如果您的系统上有 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