免费注册 查看新帖 |

Chinaunix

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

[文本处理] sort域中字母数字混合排序问题 [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:16:53
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-02-27 00:30 |只看该作者 |倒序浏览
本帖最后由 yu37976285 于 2015-02-27 00:34 编辑

如2与3两个文件,在3中混合字母数字排序是没问题的,但是在2中,相同命令排序怎么不正常?是以空格分隔的,列应该没搞错,求教

$ cat 3
A0   
A1   
A10  
A100
A101
A102
A103
A104
A105
A106
A107
A108
A109
A11  
A12  
A2   
A20  

$ sort -t ' ' -k1.2n 3

A0   
A1   
A2   
A10  
A11  
A12  
A20  
A100
A101
A102
A103
A104
A105
A106
A107
A108
A109
$
$ cat 2
91.124 (5, 2219)         NOT-INIT  A0 (5,681800)   
91.124 (5, 2219)         NOT-INIT  A1 (5,681801)   
91.124 (5, 2219)         NOT-INIT  A10 (5,605027)   
91.124 (5, 2219)         NOT-INIT  A100 (5,681833)  
91.124 (5, 2219)         NOT-INIT  A101 (5,656278)  
91.124 (5, 2219)         NOT-INIT  A102 (5,681835)  
91.124 (5, 2219)         NOT-INIT  A103 (5,656276)  
91.124 (5, 2219)         NOT-INIT  A104 (5,681837)  
91.124 (5, 2219)         NOT-INIT  A105 (5,681838)  
91.124 (5, 2219)         NOT-INIT  A106 (5,681839)  
91.124 (5, 2219)         NOT-INIT  A107 (5,681840)  
91.124 (5, 2219)         NOT-INIT  A108 (5,681841)  
91.124 (5, 2219)         NOT-INIT  A109 (5,681842)  
91.124 (5, 2219)         NOT-INIT  A11 (5,570030)   
91.124 (5, 2219)         NOT-INIT  A12 (5,570029)   
91.124 (5, 2219)         NOT-INIT  A2 (5,681802)   
91.124 (5, 2219)         NOT-INIT  A20 (5,535016)  
$ sort -t ' ' -k5.2n 2
91.124 (5, 2219)         NOT-INIT  A0 (5,681800)   
91.124 (5, 2219)         NOT-INIT  A100 (5,681833)  
91.124 (5, 2219)         NOT-INIT  A101 (5,656278)  
91.124 (5, 2219)         NOT-INIT  A102 (5,681835)  
91.124 (5, 2219)         NOT-INIT  A103 (5,656276)  
91.124 (5, 2219)         NOT-INIT  A104 (5,681837)  
91.124 (5, 2219)         NOT-INIT  A105 (5,681838)  
91.124 (5, 2219)         NOT-INIT  A10 (5,605027)   
91.124 (5, 2219)         NOT-INIT  A106 (5,681839)  
91.124 (5, 2219)         NOT-INIT  A107 (5,681840)  
91.124 (5, 2219)         NOT-INIT  A108 (5,681841)  
91.124 (5, 2219)         NOT-INIT  A109 (5,681842)  
91.124 (5, 2219)         NOT-INIT  A11 (5,570030)   
91.124 (5, 2219)         NOT-INIT  A12 (5,570029)   
91.124 (5, 2219)         NOT-INIT  A1 (5,681801)   
91.124 (5, 2219)         NOT-INIT  A20 (5,535016)  
91.124 (5, 2219)         NOT-INIT  A2 (5,681802)
$ sort -t ' ' -k5.2r 2
91.124 (5, 2219)         NOT-INIT  A2 (5,681802)   
91.124 (5, 2219)         NOT-INIT  A20 (5,535016)  
91.124 (5, 2219)         NOT-INIT  A1 (5,681801)   
91.124 (5, 2219)         NOT-INIT  A12 (5,570029)   
91.124 (5, 2219)         NOT-INIT  A11 (5,570030)   
91.124 (5, 2219)         NOT-INIT  A109 (5,681842)  
91.124 (5, 2219)         NOT-INIT  A108 (5,681841)  
91.124 (5, 2219)         NOT-INIT  A107 (5,681840)  
91.124 (5, 2219)         NOT-INIT  A106 (5,681839)  
91.124 (5, 2219)         NOT-INIT  A10 (5,605027)   
91.124 (5, 2219)         NOT-INIT  A105 (5,681838)  
91.124 (5, 2219)         NOT-INIT  A104 (5,681837)  
91.124 (5, 2219)         NOT-INIT  A103 (5,656276)  
91.124 (5, 2219)         NOT-INIT  A102 (5,681835)  
91.124 (5, 2219)         NOT-INIT  A101 (5,656278)  
91.124 (5, 2219)         NOT-INIT  A100 (5,681833)  
91.124空格(5,空格2219)     多个空格 NOT-INIT 多个空格A0 空格(5,681800)

论坛徽章:
28
2015年迎新春徽章
日期:2015-03-04 10:16:53午马
日期:2015-03-20 17:11:07亥猪
日期:2015-03-20 17:11:23戌狗
日期:2015-03-20 17:11:33酉鸡
日期:2015-03-20 17:11:47申猴
日期:2015-03-20 17:11:58未羊
日期:2015-03-20 17:12:10子鼠
日期:2015-03-20 17:12:23丑牛
日期:2015-03-20 17:12:40卯兔
日期:2015-03-20 17:12:51辰龙
日期:2015-03-20 17:13:00巳蛇
日期:2015-03-20 17:13:12
2 [报告]
发表于 2015-02-27 01:18 |只看该作者
sort -tA -nk2

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
3 [报告]
发表于 2015-02-27 02:04 |只看该作者
本帖最后由 jason680 于 2015-02-27 02:10 编辑

回复 1# yu37976285

There is some bug in sort

$ sort --version
sort (GNU coreutils) 8.13
...

1. check the field number
$ awk -F'[ ]' '{for(n=1;n<NF;n++)printf "$"n"="$n", ";print"";exit}' 2
$1=91.124, $2=(5,, $3=2219), $4=, $5=, $6=, $7=, $8=, $9=, $10=, $11=, $12=NOT-INIT, $13=, $14=A0, $15=(5,681800), $16=, $17=,

2. assign filed separator and the right field number by yourself
Note: this way is hard to know the field number 14 for your data(Axxx)
$ sort -t' '  -k14.2n 2
91.124 (5, 2219)         NOT-INIT  A0 (5,681800)   
91.124 (5, 2219)         NOT-INIT  A1 (5,681801)   
91.124 (5, 2219)         NOT-INIT  A2 (5,681802)   
91.124 (5, 2219)         NOT-INIT  A10 (5,605027)   
91.124 (5, 2219)         NOT-INIT  A11 (5,570030)   
91.124 (5, 2219)         NOT-INIT  A12 (5,570029)   
91.124 (5, 2219)         NOT-INIT  A20 (5,535016)  
91.124 (5, 2219)         NOT-INIT  A100 (5,681833)  
91.124 (5, 2219)         NOT-INIT  A101 (5,656278)  
91.124 (5, 2219)         NOT-INIT  A102 (5,681835)  


without assign the field separator and get some bug ...

1. using -k5.2n can not get the right answer
$ sort -k5.2n 2
91.124 (5, 2219)         NOT-INIT  A0 (5,681800)   
91.124 (5, 2219)         NOT-INIT  A100 (5,681833)  
91.124 (5, 2219)         NOT-INIT  A101 (5,656278)  
91.124 (5, 2219)         NOT-INIT  A102 (5,681835)  
91.124 (5, 2219)         NOT-INIT  A10 (5,605027)   
91.124 (5, 2219)         NOT-INIT  A11 (5,570030)   
91.124 (5, 2219)         NOT-INIT  A12 (5,570029)   
91.124 (5, 2219)         NOT-INIT  A1 (5,681801)   
91.124 (5, 2219)         NOT-INIT  A20 (5,535016)  
91.124 (5, 2219)         NOT-INIT  A2 (5,681802)   

2. but, using -k5.4n can get the right answer
$ sort -k5.4n 2
91.124 (5, 2219)         NOT-INIT  A0 (5,681800)   
91.124 (5, 2219)         NOT-INIT  A1 (5,681801)   
91.124 (5, 2219)         NOT-INIT  A2 (5,681802)   
91.124 (5, 2219)         NOT-INIT  A10 (5,605027)   
91.124 (5, 2219)         NOT-INIT  A11 (5,570030)   
91.124 (5, 2219)         NOT-INIT  A12 (5,570029)   
91.124 (5, 2219)         NOT-INIT  A20 (5,535016)  
91.124 (5, 2219)         NOT-INIT  A100 (5,681833)  
91.124 (5, 2219)         NOT-INIT  A101 (5,656278)  
91.124 (5, 2219)         NOT-INIT  A102 (5,681835)  

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:16:53
4 [报告]
发表于 2015-02-27 04:05 |只看该作者
回复 2# 我是一隻羊


  谢谢大神,最简单就解决了,用A当分隔符,我就没想到,谢谢

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:16:53
5 [报告]
发表于 2015-02-27 04:09 |只看该作者
回复 3# jason680


谢谢大神解释的这么清楚,听你解释了明白了,是跟版本有关。并且用AWK比较出来,果然是一流大牛,谢谢

$ lsb_release
LSB Version:    :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch
$ sort --ver
sort (GNU coreutils) 5.97   

论坛徽章:
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 [报告]
发表于 2015-02-27 09:11 |只看该作者
回复 5# yu37976285


    你的环境下,下面的命令会得到什么结果?
  1. sort -t ' ' -k 14.2n 2
复制代码

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
7 [报告]
发表于 2015-02-27 09:21 |只看该作者
本帖最后由 jason680 于 2015-02-27 09:28 编辑

回复 5# yu37976285

$ man sort
NAME
       sort - sort lines of text files
       ...

       -b, --ignore-leading-blanks
             ignore leading blanks
       ....


1. without ignore leading blanks
Note: the data is ..A0 with 2 space(leading blanks)
$ sort  -k5.4n 2
91.124 (5, 2219)         NOT-INIT..A0 (5,681800)   
91.124 (5, 2219)         NOT-INIT  A1 (5,681801)   
91.124 (5, 2219)         NOT-INIT  A2 (5,681802)   
91.124 (5, 2219)         NOT-INIT  A10 (5,605027)   
91.124 (5, 2219)         NOT-INIT  A11 (5,570030)   
91.124 (5, 2219)         NOT-INIT  A12 (5,570029)   
91.124 (5, 2219)         NOT-INIT  A20 (5,535016)  
91.124 (5, 2219)         NOT-INIT  A100 (5,681833)  
91.124 (5, 2219)         NOT-INIT  A101 (5,656278)  
91.124 (5, 2219)         NOT-INIT  A102 (5,681835)  

2. with ignore leading blanks by -b argument
Note: the data is A0 without space(leading blanks)
$ sort  -k5.2nb 2
91.124 (5, 2219)         NOT-INIT  A0 (5,681800)   
91.124 (5, 2219)         NOT-INIT  A1 (5,681801)   
91.124 (5, 2219)         NOT-INIT  A2 (5,681802)   
91.124 (5, 2219)         NOT-INIT  A10 (5,605027)   
91.124 (5, 2219)         NOT-INIT  A11 (5,570030)   
91.124 (5, 2219)         NOT-INIT  A12 (5,570029)   
91.124 (5, 2219)         NOT-INIT  A20 (5,535016)  
91.124 (5, 2219)         NOT-INIT  A100 (5,681833)  
91.124 (5, 2219)         NOT-INIT  A101 (5,656278)  
91.124 (5, 2219)         NOT-INIT  A102 (5,681835)  

   

论坛徽章:
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
8 [报告]
发表于 2015-02-27 09:41 |只看该作者
回复 3# jason680


    这不是什么 bug, 是 sort 的"正常表现"。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:16:53
9 [报告]
发表于 2015-02-28 14:24 |只看该作者
本帖最后由 yu37976285 于 2015-02-28 14:25 编辑

回复 8# blackold

运行是正常的,用空格分隔,为什么是14列呢,想不通,求解释,谢谢

$ sort --version
sort (GNU coreutils) 5.97
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software.  You may redistribute copies of it under the terms of

$ sort -t ' ' -k 14.2n 2
91.124 (5, 2219)         NOT-INIT  A0 (5,681800)   
91.124 (5, 2219)         NOT-INIT  A1 (5,681801)   
91.124 (5, 2219)         NOT-INIT  A2 (5,681802)   
91.124 (5, 2219)         NOT-INIT  A10 (5,605027)   
91.124 (5, 2219)         NOT-INIT  A11 (5,570030)   
91.124 (5, 2219)         NOT-INIT  A12 (5,570029)   
91.124 (5, 2219)         NOT-INIT  A20 (5,535016)  
91.124 (5, 2219)         NOT-INIT  A100 (5,681833)  
91.124 (5, 2219)         NOT-INIT  A101 (5,656278)  
91.124 (5, 2219)         NOT-INIT  A102 (5,681835)  
91.124 (5, 2219)         NOT-INIT  A103 (5,656276)  
91.124 (5, 2219)         NOT-INIT  A104 (5,681837)  
91.124 (5, 2219)         NOT-INIT  A105 (5,681838)  
91.124 (5, 2219)         NOT-INIT  A106 (5,681839)  
91.124 (5, 2219)         NOT-INIT  A107 (5,681840)  
91.124 (5, 2219)         NOT-INIT  A108 (5,681841)  
91.124 (5, 2219)         NOT-INIT  A109 (5,681842)
   

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:16:53
10 [报告]
发表于 2015-02-28 14:28 |只看该作者
回复 8# blackold

运行是正常的,但是不明白空格分隔的时候为什么是14列?求解释,谢谢
$ sort --version
sort (GNU coreutils) 5.97
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software.  You may redistribute copies of it under the terms of

$ sort -t ' ' -k 14.2n 2
91.124 (5, 2219)         NOT-INIT  A0 (5,681800)   
91.124 (5, 2219)         NOT-INIT  A1 (5,681801)   
91.124 (5, 2219)         NOT-INIT  A2 (5,681802)   
91.124 (5, 2219)         NOT-INIT  A10 (5,605027)   
91.124 (5, 2219)         NOT-INIT  A11 (5,570030)   
91.124 (5, 2219)         NOT-INIT  A12 (5,570029)   
91.124 (5, 2219)         NOT-INIT  A20 (5,535016)  
91.124 (5, 2219)         NOT-INIT  A100 (5,681833)  
91.124 (5, 2219)         NOT-INIT  A101 (5,65627  
91.124 (5, 2219)         NOT-INIT  A102 (5,681835)  
91.124 (5, 2219)         NOT-INIT  A103 (5,656276)  
91.124 (5, 2219)         NOT-INIT  A104 (5,681837)  
91.124 (5, 2219)         NOT-INIT  A105 (5,68183  
91.124 (5, 2219)         NOT-INIT  A106 (5,681839)  
91.124 (5, 2219)         NOT-INIT  A107 (5,681840)  
91.124 (5, 2219)         NOT-INIT  A108 (5,681841)  
91.124 (5, 2219)         NOT-INIT  A109 (5,681842)
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP