免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 15334 | 回复: 45
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-25 20:39 |只看该作者 |倒序浏览
原始数据如下:
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
efdasfdf 30 0 40 0  //感觉这一行应该和第三行互换,因为50大于40嘛,即sort -nr -k2 a.txt相当于sort -nr -k2,5 a.txt
dffdfdsf 30 0 50 0
fdfjksdf 20 0 40 0

执行sort -r -k2 a.txt 后,结果如下(正常的,即按照字符排序):
fdasfdas 40 0 30 0
dffdfdsf 30 0 50 0
efdasfdf 30 0 40 0
fdfjksdf 20 0 40 0

论坛徽章:
0
2 [报告]
发表于 2012-07-25 21:17 |只看该作者
求帮助啊,真搞不懂了

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


    这是重排引起的。加 -s 就行了。

论坛徽章:
0
4 [报告]
发表于 2012-07-25 21:35 |只看该作者
刚试了下,确实正常了,sort -k2(相当于sort -k2,5)是不是意思是?(哪种呢)
1.从第2列开始排序,先排列第2列,遇到相等的,就排列第三列,以此类推
2.把第2列到最后一列组成一列,然后排序

应该是按照第一种理解吧?

如果不加-s,那么排列完后,还得按照第1列再次排序?
但是2 3 4 5列排序完后,并没有相等的了啊,应该按照第一列排序无效啊,为何还会影响结果呢?
谢谢哈,不太理解

blackold 发表于 2012-07-25 21:19
回复 1# ben123one

论坛徽章:
0
5 [报告]
发表于 2012-07-25 21:54 |只看该作者
我又实验了下:
原始数据:
fdasfdas 30 0 30 0
dffdfdsf 30 0 50 0
efdasfdf 30 0 40 0
fdfjksdf 20 0 40 0
经过 sort -snr -k2 a.txt 后

fdasfdas 30 0 30 0  // 前3行没有按照第4列的降序进行排列啊
dffdfdsf 30 0 50 0
efdasfdf 30 0 40 0
fdfjksdf 20 0 40 0




回复 3# 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
6 [报告]
发表于 2012-07-25 22:00 |只看该作者
本帖最后由 blackold 于 2012-07-25 22:18 编辑

回复 4# ben123one


    对于你的数据,
sor -nr -k 2 相当于
先按 2字段进行数值逆序排序,再按 1,3,4,5进行字符串逆序排序(重排)

论坛徽章:
0
7 [报告]
发表于 2012-07-25 23:09 |只看该作者

我大概明白了,-k2,5是指 按照第二列排序,如果行的第二到第五个元素都相同,则进行重排,即再次从第1列排序

但是指定-n后,第一列四海字母,它是如何排序的啊


回复 3# blackold


   

论坛徽章:
0
8 [报告]
发表于 2012-07-25 23:11 |只看该作者
还有个问题哈

就是如何忽略第一列,即假设从第二列排序,有重复的,再次排序的序列为3 4 5,而不是 1 3 4 5


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


    分别指定,如 sor -rn -k2,2 -k3,3 -k4,4

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

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

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

还有个问题就是

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


回复 10# blackold


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP