对于以下示例数据,两列都是数字,但第二列的位数不同。
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"
数字进行比较。对于数字比较,通过考虑看起来像有效数字的前导部分(忽略前导空格),将这些字符串转换为数字。所以我们将比较1
和1
。由于它们相等,sort
将恢复到回退排序以确定关系,这是整行的词法比较。
与-n -k1,1 -k2,2
、sort
进行比较"1"
,"1"
然后因为它是平局,所以考虑第二个键 ( " 50"
vs " 1000"
)。由于它是数字排序,因此-n -k1 -k2
也可以工作(其中-k1
指定从第一个字段开始并在行末尾结束的键,与整行相同)。