Bash 数字排序在同时选择列和一起选择列时给出不同的结果

njc*_*njc 2 sort numeric-data

对于以下示例数据,两列都是数字,但第二列的位数不同。

2 9
1 1000
1 50
3 0
Run Code Online (Sandbox Code Playgroud)

我想根据两列进行排序。用数字标志分别指定它们-n,产生我想要的结果。

sort -n -k1,1 -k2,2 num.data.txt
Run Code Online (Sandbox Code Playgroud)

1 50
1 1000
2 9
3 0
Run Code Online (Sandbox Code Playgroud)

这就是我想要的。

然而,

sort -n -k1,2 num.data.txt
Run Code Online (Sandbox Code Playgroud)

给出似乎按字母顺序排序的数据:

1 1000
1 50
2 9
3 0
Run Code Online (Sandbox Code Playgroud)

我知道这sort -n -k1,2 num.data.txtsort -n num.data.txt只有两列时(给出相同结果)相同,但我实际使用的数据有更多列。

为什么这两种方法之间存在这种差异?

Sté*_*las 5

-k1,2密钥规范指定一个密钥,在所述第一列的开始开始(包括前导空白作为默认列分隔是从非空白到空白转变)在第二柱的端部并结束。

重要的是要意识到它只是一把钥匙。如果您需要两个键,则需要两个-k选项。排序时,sort"1 50"字符串与"1 1000"数字进行比较。对于数字比较,通过考虑看起来像有效数字的前导部分(忽略前导空格)将这些字符串转换为数字。所以我们将比较11。由于它们相等,sort将恢复回退排序以确定关系,这是整行的词汇比较。

-n -k1,1 -k2,2,sort比较"1""1"然后因为它是平局,考虑第二个键 ( " 50"vs " 1000")。由于它是数字排序,-n -k1 -k2因此也可以工作(其中-k1指定从第一个字段开始并在行尾结束的键,与整行相同)。

  • 在 GNU 排序中,添加 `--debug` 行以进行可视化表示(以及信息丰富的“排序:键 1 是数字并跨越多个字段” (3认同)