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

yej*_*xin 7 unix linux sorting shell

说我有这个文件.

$ cat a.txt
c 1002 4
f 1001 1
d 1003 1
a 1001 3
e 1004 2
b 1001 2
Run Code Online (Sandbox Code Playgroud)

我想通过第二列然后第三列对其进行排序.第二列是数字,第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
Run Code Online (Sandbox Code Playgroud)

但是,我认为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
Run Code Online (Sandbox Code Playgroud)

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

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

Mik*_*ll' 10

我在GNU排序文档中发现了这种谨慎.

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

      sort -t : -k 2,2n -k 5.3,5.4
Run Code Online (Sandbox Code Playgroud)

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

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

同一个网页上写着关于解决"关系"的问题.

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

我承认我对如何解释它有点神秘.