GNU sort命令参数顺序是否重要?参数写法差异影响结果解析
sort命令参数写法差异导致排序结果不同的原因解析
我有一个文件a,内容如下:
manufacturer,model,year,mileage,price plym fury 1970 73 2500 chevy malibu 1999 60 3000 ford mustang 1965 45 10000 volvo s80 1998 102 9850 ford thundbd 2003 15 10500 chevy malibu 2000 50 3500 bmw 315i 1985 115 450 honda accord 2001 30 6000 ford taurus 2004 10 17000 toyota rav4 2002 180 750 chevy impala 1985 85 1550 ford explor 2003 25 9500
需求是先按厂商名称(第1字段)排序,再按价格(第5字段)倒序排序。使用命令:
(head -n 1 a) && (tail +2 a | sort -k1,1 -k5nr)
得到了符合预期的结果:
manufacturer,model,year,mileage,price bmw 315i 1985 115 450 chevy malibu 2000 50 3500 chevy malibu 1999 60 3000 chevy impala 1985 85 1550 ford taurus 2004 10 17000 ford thundbd 2003 15 10500 ford mustang 1965 45 10000 ford explor 2003 25 9500 honda accord 2001 30 6000 plym fury 1970 73 2500 toyota rav4 2002 180 750 volvo s80 1998 102 9850
但将命令中的sort -k1,1 -k5nr改为sort -k1,1 -nrk5后,结果完全不符合预期:
manufacturer,model,year,mileage,price ford taurus 2004 10 17000 ford thundbd 2003 15 10500 ford mustang 1965 45 10000 volvo s80 1998 102 9850 ford explor 2003 25 9500 honda accord 2001 30 6000 chevy malibu 2000 50 3500 chevy malibu 1999 60 3000 plym fury 1970 73 2500 chevy impala 1985 85 1550 toyota rav4 2002 180 750 bmw 315i 1985 115 450
两种写法的核心区别
sort命令的参数语法有严格的规则:
sort -k1,1 -k5nr:这里的-k5nr是将排序选项n(数字排序)和r(倒序)绑定到第5个字段。具体逻辑:- 先按第1个字段(厂商名)以默认的字典序排序;
- 对于厂商名相同的行,再按第5个字段(价格)以数字倒序排序。
这完全匹配需求,所以结果正确。
sort -k1,1 -nrk5:这里的-nr是作为全局排序选项生效的,而非绑定到某个字段。这个写法等价于sort -n -r -k1,1 -k5,逻辑变成:- 全局启用数字排序(
-n)和倒序(-r); - 先按第1个字段排序,但因为全局
-n,会尝试把厂商名当作数字解析——显然厂商名不是有效数字,所有行的第1字段数字排序结果一致; - 再按第5个字段数字倒序排序。
最终整体就变成了只按价格倒序排序,完全忽略了厂商的字典序,所以结果和预期完全不同。
- 全局启用数字排序(
简单来说:-kXnr是给第X字段单独加排序规则,而-nrkX是先开启全局数字倒序,再指定按第X字段排序,两者的作用范围完全不一样。
内容的提问来源于stack exchange,提问作者Niranjan
相关产品推荐
相关产品推荐

