7

说我有这个文件。

$ cat a.txt
c 1002 4
f 1001 1
d 1003 1
a 1001 3
e 1004 2
b 1001 2

我想按第二列然后按第三列对其进行排序。第二列是数字,而第三列可以视为字符串。我知道以下命令效果很好。

$ sort -k2,2n -k3,3 a.txt
f 1001 1
b 1001 2
a 1001 3
c 1002 4
d 1003 1
e 1004 2

但是,我认为sort -k2n a.txt也应该起作用,而事实并非如此。

$ sort -k2n a.txt
a 1001 3
b 1001 2
f 1001 1
c 1002 4
d 1003 1
e 1004 2

似乎它按第二列排序,然后按第一列而不是第三列排序。为什么会这样?这是一个错误吗?原因sort -k2 a.txt适用于上述数据,因为这些数字只是固定宽度。

我的排序版本sort (GNU coreutils) 8.15在 cygwin 中。

4

1 回答 1

10

我在GNU 排序文档中发现了这种警告。

在第二个字段上按数字排序,并通过按字母顺序在字段五的第三个和第四个字符上排序来解决平局。使用 ':' 作为字段分隔符。

      sort -t : -k 2,2n -k 5.3,5.4

请注意,如果您编写了 -k 2n 而不是 -k 2,2n,则排序将使用从第二个字段开始并延伸到行尾的所有字符作为主数字键。对于大多数应用程序,将跨越多个字段的键视为数字不会达到您的预期。

我不确定当它评估 '1001 3' 作为数字键时会产生什么结果,但“不会做你期望的”是准确的。显然,正确的做法是独立指定每个键。

同一个网页说明了解决“关系”的问题。

最后,作为最后的手段,当所有键比较相等时,sort 会比较整行,就好像没有指定除 --reverse (-r) 之外的排序选项一样。

我承认我对如何解释它有点迷惑。

于 2013-06-08T11:18:09.793 回答