使用Linux sort命令使用多个键进行排序

时间:2013-06-08 10:36:05

标签: linux shell unix sorting

说我有这个档案。

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

我希望按第二列排序,然后按第三列排序。第二列是数字,第3列可以视为字符串。我知道以下命令效果很好。

$ 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可以正常使用上述数据,因为这些数字只是固定宽度。

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

1 个答案:

答案 0 :(得分:10)

我在GNU sort docs中找到了这个警告。

  

在第二个字段上以数字方式排序,并通过排序解决关系   按字母顺序排列第五场的第三和第四个字符。使用   ':'作为字段分隔符。

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

请注意,如果你写了-k 2n而不是-k 2,2n sort会有   使用从第二个字段开始并扩展到的所有字符   行的结尾作为主要数字键。对于大多数人来说   应用程序,将跨越多个字段的键视为数字   不会做你期望的事。

我不确定当它将'1001 3'评估为数字键时它最终会得到什么,但是“不会做你期望的”是准确的。似乎很明显,正确的事情是独立指定每个密钥。

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

  

最后,作为所有键比较相等的最后手段,排序比较   整条线好像没有--reverse(-r)以外没有订购选项   指定。

我会承认我对如何理解这一点感到有点神秘。