使用数字选项时的排序行为:“sort -k2,2 -nk6,6 foo”与“sort -k2,2 -k6,6n foo”

使用数字选项时的排序行为:“sort -k2,2 -nk6,6 foo”与“sort -k2,2 -k6,6n foo”

标题中的两个示例产生非常不同的结果。第一个 ( sort -k2,2 -nk6,6 foo) 返回以下结果:

153759 townhome 900 2 1 79000
876543 townhome 745 2 1 79000
222999 townhome 850 2 2 83333
759153 condo 850 2 1.5 85000
453215 townhome 1000 3 1.5 86000
646484 condo 890 3 1 93333
444555 condo 930 2 1 99999

ETC。

第二个 ( sort -k2,2 -k6,6n foo) 返回:

759153 condo 850 2 1.5 85000
646484 condo 890 3 1 93333
444555 condo 930 2 1 99999
777894 condo 790 3 1 101000
221155 condo 1030 3 1 109500
248624 duplex 1250 3 1 120000
987654 duplex 1100 3 1.5 140000

这些是我正在寻找的正确结果。

是什么导致了这种差异?

答案1

作为迈克塞夫 说,但更多的话:

使用“全局”-n数字排序选项会更改排序的全局行为,以对所有键使用数字排序(参考)通过设置 gkey.numeric 然后再设置设置每个键的全局设置的数字排序选项的排序选项。这会导致字段 2 的排序失败,因此会转而对字段 6 进行(数字)排序。

设置n 订购选项该选项内部-k仅影响对该字段的排序,因此它可以对字段 2 进行排序,直到该字段不唯一为止,然后对字段 6 进行数字排序。

因为我在第一个排序示例中找不到“双工”行,所以我独特地组合了所有示例行来创建一个新的示例输入文件:

153759 townhome 900 2 1 79000
221155 condo 1030 3 1 109500
222999 townhome 850 2 2 83333
248624 duplex 1250 3 1 120000
444555 condo 930 2 1 99999
453215 townhome 1000 3 1.5 86000
646484 condo 890 3 1 93333
759153 condo 850 2 1.5 85000
777894 condo 790 3 1 101000
876543 townhome 745 2 1 79000
987654 duplex 1100 3 1.5 140000

...我们可以用标志来演示排序的行为--debug;请注意第 6 个字段上的“不匹配”警告和下划线,指示排序用于排序的行部分:

$ sort -k2,2 -nk6,6 --debug < input
sort: using ‘en_US.UTF-8’ sorting rules
153759 townhome 900 2 1 79000
       ^ no match for key
                        _____
_____________________________
876543 townhome 745 2 1 79000
       ^ no match for key
                        _____
_____________________________
222999 townhome 850 2 2 83333
       ^ no match for key
                        _____
_____________________________
759153 condo 850 2 1.5 85000
       ^ no match for key
                       _____
____________________________
453215 townhome 1000 3 1.5 86000
       ^ no match for key
                           _____
________________________________
646484 condo 890 3 1 93333
       ^ no match for key
                     _____
__________________________
444555 condo 930 2 1 99999
       ^ no match for key
                     _____
__________________________
777894 condo 790 3 1 101000
       ^ no match for key
                     ______
___________________________
221155 condo 1030 3 1 109500
       ^ no match for key
                      ______
____________________________
248624 duplex 1250 3 1 120000
       ^ no match for key
                       ______
_____________________________
987654 duplex 1100 3 1.5 140000
       ^ no match for key
                         ______
_______________________________

对比:

$ sort -k2,2 -k6,6n --debug < input
sort: using ‘en_US.UTF-8’ sorting rules
sort: leading blanks are significant in key 1; consider also specifying 'b'
759153 condo 850 2 1.5 85000
      ______
                       _____
____________________________
646484 condo 890 3 1 93333
      ______
                     _____
__________________________
444555 condo 930 2 1 99999
      ______
                     _____
__________________________
777894 condo 790 3 1 101000
      ______
                     ______
___________________________
221155 condo 1030 3 1 109500
      ______
                      ______
____________________________
248624 duplex 1250 3 1 120000
      _______
                       ______
_____________________________
987654 duplex 1100 3 1.5 140000
      _______
                         ______
_______________________________
153759 townhome 900 2 1 79000
      _________
                        _____
_____________________________
876543 townhome 745 2 1 79000
      _________
                        _____
_____________________________
222999 townhome 850 2 2 83333
      _________
                        _____
_____________________________
453215 townhome 1000 3 1.5 86000
      _________
                           _____
________________________________

相关内容