sort 在做什么

Con*_*cer 2 shell-script sort

这是这个问题的后续问题:What does sort -n do with non numeric values?

这是我的输入:

1-----***
R----****
1---*****
Run Code Online (Sandbox Code Playgroud)

我跑:

sort -k 1.2,1.9n input.txt > output.txt
Run Code Online (Sandbox Code Playgroud)

这是我的输出:

1-----***
1---*****
R----****
Run Code Online (Sandbox Code Playgroud)

我的预期输出:

1---*****
R----****
1-----***
Run Code Online (Sandbox Code Playgroud)

我期望此输出,因为 * (42) 的 ASCII 值小于 - (45) 的值。然而,似乎 R 正在被考虑在排序中,但我认为 1.2,1.9 会排除它。我究竟做错了什么?

cas*_*sey 5

您使用的排序键无效(无效,因为它与您的输入文本不匹配)。排序的信息手册建议使用该--debug选项来调查其键匹配的行为。使用您的命令键,1.2,1.9n sort 会产生以下输出:

\n\n
% sort -k 1.2,1.9n --debug input.txt \nsort: using \xe2\x80\x98en_US.UTF-8\xe2\x80\x99 sorting rules\n1-----***\n ^ no match for key\n_________\n1---*****\n ^ no match for key\n_________\nR----****\n ^ no match for key\n_________\n
Run Code Online (Sandbox Code Playgroud)\n\n

并且似乎会退回到使用整个字段的默认排序。如果您省略n密钥中的 并仅使用1.2,1.9您会得到以下内容:

\n\n
% sort -k 1.2,1.9 --debug input.txt \nsort: using \xe2\x80\x98en_US.UTF-8\xe2\x80\x99 sorting rules\n1-----***\n ________\n_________\nR----****\n ________\n_________\n1---*****\n ________\n_________\n
Run Code Online (Sandbox Code Playgroud)\n\n

它正确使用第一个字段的第 2 个到第 9 个字符进行排序操作。

\n