免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ttxy624
打印 上一主题 下一主题

sort排序疑问 [复制链接]

论坛徽章:
1
寅虎
日期:2013-08-22 20:18:39
21 [报告]
发表于 2010-12-29 13:22 |只看该作者
回复 20# xiaopan3322


    我的意思是第2个例子,在没有使用-n参数的情况下,指定从第2列到第3列排序,相同时会再以第1列排序,这应该是正常的,但是第4个例子,我指定让他从第2列到第4列排序,正常最后一列的顺序应该是1,2,3的顺序,但结果这种情况是出现在第一列,那么说明第4个例子的-n -k 2,4等于-n -k 2,2了,这应该是不对的

论坛徽章:
0
22 [报告]
发表于 2010-12-29 17:36 |只看该作者
回复 21# ttxy624

因为没有源文件,我不知道你原来的example文件中是什么,但是我这边是正常的,最后一列还是按照1 2 3排序了,
  1. [Bob@hzling05:~/test]-No.117-$ cat a.txt
  2. 3       2       8       3
  3. 2       2       8       2
  4. 1       2       8       1
  5. [Bob@hzling05:~/test]-No.118-$ sort -n -k 2,4 a.txt
  6. 1       2       8       1
  7. 2       2       8       2
  8. 3       2       8       3
复制代码

论坛徽章:
1
寅虎
日期:2013-08-22 20:18:39
23 [报告]
发表于 2010-12-29 18:16 |只看该作者
回复 22# xiaopan3322


    你把第一列换下顺序试试

论坛徽章:
1
2015亚冠之柏太阳神
日期:2015-09-29 10:00:55
24 [报告]
发表于 2010-12-30 11:22 |只看该作者
我觉得应该是locale参数的问题,(LC_COLLATE)比较和排序习惯,他会影响sort的排序,建议设置成C或者POSIX。可以用a-z、A-Z排序试试区别。

论坛徽章:
1
寅虎
日期:2013-08-22 20:18:39
25 [报告]
发表于 2010-12-30 19:53 |只看该作者
回复 24# qq5910225


   语言环境我已经说明过了,我觉得你可以先自己测试一下。

论坛徽章:
0
26 [报告]
发表于 2010-12-30 20:06 |只看该作者
-n, --numeric-sort          compare according to string numerical value

论坛徽章:
1
寅虎
日期:2013-08-22 20:18:39
27 [报告]
发表于 2010-12-30 20:09 |只看该作者
回复 26# linuxboy823


    这能说明什么呢?

论坛徽章:
0
28 [报告]
发表于 2011-01-04 21:59 |只看该作者
回复 27# ttxy624


   数值比较!

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
29 [报告]
发表于 2011-01-18 07:40 |只看该作者
本帖最后由 yinyuemi 于 2011-01-18 13:36 编辑

回复 1# ttxy624

不知lz的问题是否解决,下面是我的一些理解,
    经过一些数据的测试,得出以下一些结论,欢迎大家给予指正:

lz的问题主要是sort 排序的时候,使用-n 和不使用 -n 对参数-k 排序结果有没有影响,答案应该是肯定的。
首先我们大概了解下,sort 对数据和字符在使用-n和不使用-n排序的区别:

  1. # 未使用-n
  2. echo "1
  3. 10
  4. 2
  5. a
  6. b

  7. 0a" |sort

  8. 0a
  9. 1
  10. 10
  11. 2
  12. a
  13. b

  14. # 使用-n

  15. echo "1
  16. 10
  17. 2
  18. a
  19. b

  20. 0a" |sort -n

  21. 0a
  22. a
  23. b
  24. 1
  25. 2
  26. 10
复制代码
从上面的排序结果来看,如果不使用-n,排序的从小到大为,空值,0,数字[1-9],字符;如果使用-n,则为空值,0,字母,字符[1-9]。

接下来我们再看下-k参数的使用,
  1. cat file
  2. 1 2 8 3 3
  3. 2 2 8 2 2
  4. 3 2 8 2 1

  5. # 以第2个位置为关键字排序
  6. sort -k2 file
  7. 3 2 8 2 1
  8. 2 2 8 2 2
  9. 1 2 8 3 3

  10. # 以第2到3个位置为关键字排序
  11. sort -k2,3 file
  12. 1 2 8 3 3
  13. 2 2 8 2 2
  14. 3 2 8 2 1

  15. # 以第2到4个位置为关键字排序
  16. sort -k2,4 file
  17. 2 2 8 2 2
  18. 3 2 8 2 1
  19. 1 2 8 3 3

  20. # 以第2到5个位置(即结尾)为关键字排序
  21. sort -k2,5 file
  22. 3 2 8 2 1
  23. 2 2 8 2 2
  24. 1 2 8 3 3

复制代码
以第二列为关键字排序,可以看出来,sort -k2 是等价于sort -k2,n(结尾)的,
而sort k2,m (m<n), 则是先按照指定的位置来排序,然后再返回第一列,如果第一列相同,再从m+1到n。

如果加上 -n会是什么情况呢?
我们在理解-n参数的时候,最简单的便是让sort按照数值来排序,所以想象中,sort -n -k2 file 的执行结果是:
3 2 8 2 1
2 2 8 2 2
1 2 8 3 3

而实际呢?

  1. sort -n file
  2. 1 2 8 3 3
  3. 2 2 8 2 2
  4. 3 2 8 2 1

  5. sort -n -k2 file
  6. 1 2 8 3 3
  7. 2 2 8 2 2
  8. 3 2 8 2 1

复制代码
对照前面的sort -k2的结果, 不难看出两者的区别。

这是为什么?
我的理解是:sort 的执行顺序决定的,
sort首先执行-n命令,将所有的数据按照数值大小从第一列开始排序直到最后一列,
然后再执行k命令,按照指定位置排序,注意:这次排序只有一次,而不是从指定位置开始直到最后一列。

这样,lz的一个例子, 也就可以解释通了。
# sort -k 2 example
3       2       8       1
2       2       8       2
1       2       8       3

# sort -n -k 2 example
1       2       8       3
2       2       8       2
3       2       8       1

除此之外,-n 对 -km,n也是有影响的,如:
  1. sort -n -k2,4 file
  2. 1 2 8 3 3
  3. 2 2 8 2 2
  4. 3 2 8 2 1
复制代码
可以看出来,sort -n -k2 和sort -n -k2,4的执行结果是一样的,
表明,如果有-n命令存在的时候,-km=-km,i=-km,n。

还需要注意的是,-n对-km -ki 的命令,除了按照数值大小排序,没有别的影响。

表述有些乱,大家见谅!

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
30 [报告]
发表于 2011-01-18 09:49 |只看该作者
这么久还没停?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP