免费注册 查看新帖 |

Chinaunix

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

[文本处理] sort排序-k 感觉不按常规出牌 [复制链接]

论坛徽章:
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
21 [报告]
发表于 2012-07-25 23:47 |只看该作者
回复 17# ben123one

不能仅看 -k,还要看是数值排序还是字符串(字典排序)。

   

论坛徽章:
0
22 [报告]
发表于 2012-07-25 23:49 |只看该作者
对啊,我现在指定的是-n,即数值排序的啊,50大于40啊


回复 20# blackold


   

论坛徽章:
0
23 [报告]
发表于 2012-07-25 23:52 |只看该作者
-k2,4(相当于-k2)的意思是不是 按照第二列排序,排序完后,如果第二个元素相同,则按照3 4 5 1重排。
而-k2,2的意思是:按照第二列排序,如果第二个元素相同,则按照 1  3 4 5 重排


你说不能只看-k,还要看是否有-n;
那么-n对 此有何影响?

不太明白啊。



回复 20# blackold


   

论坛徽章:
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
24 [报告]
发表于 2012-07-25 23:54 |只看该作者
回复 21# ben123one


    sort -nr -k2 a.txt
  
这是数值排序。 -k 2 相当于 -k 2,5
sort 试图对 2,5进行数值排序,但sort 只认k2,2,即只把2字段当作数值看待(只认识前面的数值)。

在这种情况下,sort 按 k2,2进行数值排序后,会对 1,3,4,5组成的"字符串“进行字符串排序。

如果不是数值排序,重排的情况就不同了。

论坛徽章:
0
25 [报告]
发表于 2012-07-26 00:00 |只看该作者
   sort -nr -k2 a.txt
  
这是数值排序。 -k 2 相当于 -k 2,5
sort 试图对 2,5进行数值排序,但sort 只认k2,2,即只把2字段当作数值看待(只认识前面的数值)。

在这种情况下,sort 按 k2,2进行数值排序后,会对 1,3,4,5组成的"字符串“进行字符串排序。

//如果按照您的说法,那么   sort -nr -k2,2 a.txt不也是上面的解释吗?它也是先按k2,2进行数值排序,然后会对1 3 4 5组成的字符串进行排序吧?那有何区别呢

如果不是数值排序,重排的情况就不同了。

如果是   sort -r -k2 a.txt,没有了-n,是不是:
先按照2 3 4 5组成的字符串进行排序,然后再对1进行字符串排序?




回复 23# blackold


   

论坛徽章:
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
26 [报告]
发表于 2012-07-26 00:04 |只看该作者
回复 24# ben123one

sort -nr -k2 和 sort -nr -k2,2是一样的。

如果不是数值排序,"先按照2 3 4 5组成的字符串进行排序,然后再对1进行字符串排序",对就是这样。


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

回复 24# ben123one


    我是这样理解的,sort -k2 的排序顺序是 2,3,。。。,n, 最后再以1排序,需要注意的是所有这些排序都是按照前面一个排序之后的结果为基础的。
    例如下:
  1. echo 'b 30 0 30 0
  2. a 30 1 40 0
  3. b 30 1 20 0
  4. a 20 0 40 0'  |sort -rn -k2
  5. b 30 1 20 0
  6. b 30 0 30 0
  7. a 30 1 40 0
  8. a 20 0 40 0

  9. 先按2列排序,30在前,20在后
  10. 在此基础上,所有2列为30的行,按照3列排序,1在前,0在后,
  11. 在此基础上,所有3列为1的行,按照4列排序,40在前,20在后,
  12. 由于第5列相同,所以排序后没有变化,
  13. 注意此时的排序结果是这样的,我这里假设第一列都是a的情况,以便解释。

  14. echo 'a 30 0 30 0
  15. a 30 1 40 0
  16. a 30 1 20 0
  17. a 20 0 40 0'  |sort -rn -k2
  18. a 30 1 40 0
  19. a 30 1 20 0
  20. a 30 0 30 0
  21. a 20 0 40 0

  22. 回到第一个例子的情况,此时的排序情况为:

  23. a 30 1 40 0
  24. b 30 1 20 0
  25. b 30 0 30 0
  26. a 20 0 40 0

  27. 最后,按照1列排序,注意此时排序只是对2列相同的行,按照-rn的排序原则就得到了最后的结果:

  28. b 30 1 20 0
  29. b 30 0 30 0
  30. a 30 1 40 0
  31. a 20 0 40 0

复制代码
基于上面的分析,用sort排序,最后是用-k指定好列数,否则结果对半不是你想要的

论坛徽章:
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
28 [报告]
发表于 2012-07-26 06:58 |只看该作者
本帖最后由 blackold 于 2012-07-26 07:09 编辑

回复 26# yinyuemi

yinyuemi,好久不见了。^_^
   
排序肯定是在之前的基础上进行的。

最后,按照1列排序,注意此时排序只是对2列相同的行,按照-rn的排序原则就得到了最后的结果


有两点似乎解释不通:

a. 为什么是"只对2列相同的行"?这似乎与"在之前排序的基础再进行排序"相矛盾。

如果是因为 -k2 中只指定了2,那么如何解释 -k2,5 的结果与 -k2 的结果相同?
  1. $ cat urfile2
  2. b 30 0 30 0
  3. a 30 1 40 0
  4. b 30 1 20 0
  5. a 20 0 40 0

  6. $ sort -rn -k2 urfile2
  7. b 30 1 20 0
  8. b 30 0 30 0
  9. a 30 1 40 0
  10. a 20 0 40 0

  11. $ sort -rn -k2,5 urfile2
  12. b 30 1 20 0
  13. b 30 0 30 0
  14. a 30 1 40 0
  15. a 20 0 40 0
复制代码
b. "最后,按照1列排序"应该就是sort man 中所谓的"last resort"(重排)。如果是重排,
关闭重排之后结果应该和第一列全为a的情况相同。但实际上不相同的:
  1. $ cat urfile1
  2. a 30 0 30 0
  3. a 30 1 40 0
  4. a 30 1 20 0
  5. a 20 0 40 0

  6. $ sort -rn -k2 urfile1
  7. a 30 1 40 0
  8. a 30 1 20 0
  9. a 30 0 30 0
  10. a 20 0 40 0

  11. $ sort -rn -s -k2 urfile2
  12. b 30 0 30 0
  13. a 30 1 40 0
  14. b 30 1 20 0
  15. a 20 0 40 0
复制代码
另外,根据man,sort不是按照单个字段逐个排序的,除非逐个指定字段:
  1. $ cat urfile1
  2. a 30 0 30 0
  3. a 30  1 40 0         //在1之前添加一个空格
  4. a 30 1 20 0
  5. a 20 0 40 0

  6. $ sort -rn -k2 urfile1
  7. a 30 1 20 0
  8. a 30 0 30 0
  9. a 30  1 40 0
  10. a 20 0 40 0
复制代码
如果是逐个字段排序,结果应该是:

  1. a 30  1 40 0
  2. a 30 1 20 0
  3. a 30 0 30 0
  4. a 20 0 40 0
复制代码
逐个字段排序的结果:

  1. $ sort -rn -k2,2 -k3,3 -k4,4 urfile1
  2. a 30  1 40 0
  3. a 30 1 20 0
  4. a 30 0 30 0
  5. a 20 0 40 0

复制代码
仅供参考,欢迎讨论。

论坛徽章:
0
29 [报告]
发表于 2012-07-26 10:33 |只看该作者
原数据
30 23 12
10 15 13
10 14 14
620 12 1
10 12 15
经过sort  -nr -k2  aa.txt后
30 23 12
10 14 14
10 15 13
620 12 1
10 12 15

所以按照第二列排序后,4 5行的两个12相同,然后组合1、3列,即1620 1510进行字符排序



回复 27# blackold


   

论坛徽章:
0
30 [报告]
发表于 2012-07-26 10:39 |只看该作者
关于-t 分割,默认是tab吧,为何咱用一个空格也默认识别呢?
比如
2ab742e518d6d8fe9f8067e299109befedcbc1f4            75         0      0         22      0         0     75         0
2ab742e518d6d8fe9f8067e299109befedcbc1f3            75         0      0           1      0         0     75         0


比如这种情况,列与列的空格的个数是不一样的,而且第二行中间那个1还是右对齐,那么排序的时候,到底按照什么分割呢,谢谢哈,昨晚发帖1小时超过10个,不让继续发帖了。。
回复 27# blackold


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP