免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
11 [报告]
发表于 2012-07-25 23:19 |只看该作者
对,我也这么想的,但是我的问题是:

列数是不固定的,也就是说,我是读的文件,到底有多少列,我不清楚,

如果按照你的想法,就得通过$(printf "-k%s" "1")类似的for循环构造表达式了,比较麻烦,就不知道sort能否直接实现呢?

还有个问题就是

-n  的时候,字母是如何处理的呢?


回复 10# 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
12 [报告]
发表于 2012-07-25 23:23 |只看该作者
回复 11# ben123one


    没有更好的办法。

  -n 表示按数值排序,而多个字段组成的字符串怎么按数值排序呢?

  字符串排序就不存在这个问题。

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


    -n 只认前面的数值,字母被忽略了。

如 45a被看作45

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

我上面的理解对吗?

像刚才
adafdfs 30 0 40 0

sort -n -k2,2结果是以数字进行第二列排序,若相等,再从第一列开始,我测试的结果就是按照字母的assic排序的。



回复 12# 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
15 [报告]
发表于 2012-07-25 23:34 |只看该作者
回复 14# ben123one


    不对。

论坛徽章:
0
16 [报告]
发表于 2012-07-25 23:36 |只看该作者
这是原始数据:
adasfdas 30 0 30 0
dffdfdsf 30 0 50 0
efdasfdf 30 0 40 0
fdfjksdf 20 0 40 0

执行后sort  -nr -k2,2 a.txt
efdasfdf 30 0 40 0
dffdfdsf 30 0 50 0
adasfdas 30 0 30 0
fdfjksdf 20 0 40 0

先按照第二列降序排列,然后前三行都是30,此时要按照第一列排序了,因为第一列都是字母,从结果看,是按照e、d、a降序排列了




回复 13# blackold


   

论坛徽章:
0
17 [报告]
发表于 2012-07-25 23:38 |只看该作者
如果下面的理解不对:

-k2,4的意思是不是 按照第二列排序,排序完后,如果第二个元素到第四个元素相同,再按照 1 3 4 5 重排;
而-k2,2的意思是:按照第二列排序,如果第二个元素相同,则按照 1  3 4 5 重排

那么:
-k2,4(相当于-k2)的意思是不是 按照第二列排序,排序完后,如果第二个元素相同,则按照3 4 5 1重排。
而-k2,2的意思是:按照第二列排序,如果第二个元素相同,则按照 1  3 4 5 重排

是这样理解吗




回复 15# 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
18 [报告]
发表于 2012-07-25 23:38 |只看该作者
回复 16# ben123one


    对啊。

论坛徽章:
0
19 [报告]
发表于 2012-07-25 23:47 |只看该作者
如果这么理解对的话,那么
原始数据如下:
fdasfdas 40 0 30 0
dffdfdsf 30 0 50 0
efdasfdf 30 0 40 0
fdfjksdf 20 0 40 0



执行sort -nr -k2 a.txt 后,期望结果是:

fdasfdas 40 0 30 0
dffdfdsf 30 0 50 0
efdasfdf 30 0 40 0  

fdfjksdf 20 0 40 0

但实际结果是
fdasfdas 40 0 30 0
efdasfdf 30 0 40 0  
dffdfdsf 30 0 50 0

fdfjksdf 20 0 40 0

如果按照我正确的理解,30相同,那么应该找第3列(都是0,仍然相同),继续找第4列,而50大于40,所以50应该在上面,单结果却正相反,为什么呢?



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

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

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP