同时选择列和同时选择列时,Bash 数字排序会给出不同的结果

同时选择列和同时选择列时,Bash 数字排序会给出不同的结果

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

2 9
1 1000
1 50
3 0

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

sort -n -k1,1 -k2,2 num.data.txt

给出

1 50
1 1000
2 9
3 0

这就是我想要的。

然而,

sort -n -k1,2 num.data.txt

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

1 1000
1 50
2 9
3 0

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

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

答案1

关键-k1,2规范指定键从第一列的开头开始(包括前导空白,因为默认列分隔符是从非空白到空白的过渡)并在第二列的末尾结束。

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

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

相关内容