LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1583|回复: 18

关于sort的问题[基本解决]

[复制链接]
发表于 2004-4-6 22:16:00 | 显示全部楼层 |阅读模式
我需要给下面的文本排序:

;ad
aa
;ab
ac

我希望得到的结果是这样的:

;ab
;ad
aa
ac

但用sort,我只能得到这样的结果:

aa
;ab
ac
;ad

也就是说,分号被忽略了。
请问有什么办法可以让sort不忽略分号吗?
谢谢!
发表于 2004-4-6 22:58:05 | 显示全部楼层
sort只能对字母和数字进行排序,我想,他对符号是不感冒的 ;)
试试这个 ;)
  1. [code]for i in "^;" "^[^;]";do
  2.         sort so|grep $i
  3. done
复制代码
结果:
;ab
;ad
aa
ac
 楼主| 发表于 2004-4-6 23:14:28 | 显示全部楼层
呵呵,这样针对性也太强了吧。
如果还有,.\[],那怎么办?
如果是a;b,又怎么办?
发表于 2004-4-6 23:15:36 | 显示全部楼层
sort是按什么规则来排序呢?ASCII码表?看不懂它的man手册。

  1. [root@home root]# cat myfile
  2. 1
  3. A
  4. a
  5. ;
  6. [root@home root]# sort myfile
  7. ;
  8. 1
  9. a
  10. A
复制代码
发表于 2004-4-7 00:18:09 | 显示全部楼层
这样又不一样了:
[/home/yongjian/shell_scripts ] cat sortdata
;ab
;ba
abd
bda
eda
daced
bba
dce
/da
[dea[c
$adecbr

1dae
!gerr
0#dcqwe;
&de31!~,.
.dqeq
,dfkle
有空行和多种非字母或数字的字符... 结果:
[root@knoppix 10:13 AM #/home/yongjian/shell_scripts ] sort sortdata
  
0#dcqwe;
1dae
;ab
abd
$adecbr
;ba
bba
bda
/da
daced
dce
&de31!~,.
[dea[c
,dfkle
.dqeq
eda
!gerr
空行排前,然后是数字,然后再是特殊字符... sort没有带任何参数, 但排列的结果就和home_king的不一样了.home_king兄的排列中;是在1前的.
发表于 2004-4-7 01:00:00 | 显示全部楼层
最初由 BBDD 发表
呵呵,这样针对性也太强了吧。
如果还有,.\[],那怎么办?
如果是a;b,又怎么办?

shell是灵活的,无论有多少种"如果",都会有相应的解决方法,但是前提是你的文本(问题)要具有规律性,否则,... ;)
 楼主| 发表于 2004-4-7 09:18:13 | 显示全部楼层
好吧,那我就改一下我的问题:
如果在ascii文本里有;,.\[]等半角符号,而且它们的位置不定,请问在linux下有没有简单的方法实现排序?

我用windows下的UltraEdit可以很方便地做到这一点,我只是想知道在linux下该怎么做。
发表于 2004-4-7 09:21:34 | 显示全部楼层
首先你得说明希望排序的规律如何,是按ASCII码表排序,还是别的~~不然做了也白费。
 楼主| 发表于 2004-4-7 09:28:37 | 显示全部楼层
对,就按Ascii值排序。
发表于 2004-4-7 09:37:00 | 显示全部楼层
另外,还存在这样一个问题要楼主回答。
如果存在下列字符串:
;abc
1ef
dkkff
in$.[]
king*

它们的长度不一,你的排序规则又要求如何呢?
我的想法是,过滤式排序。

  1. 1.先按长度排序,长度短的排上面
  2. 2.按长度分组
  3. 3.在每一组中按以下规则排序
  4.    3.1 首字母按在ASCII码表出现的先后顺序排序,如果相等跳到下一步
  5.    3.2 对首字母相等的字符串按第二个字母进行ASCII码表排序,如果相等跳到下一步
  6.    3.3 对第二个字母相等的字符串按第三个字母进行ASCII码表排序,如果相等跳到下一步
  7.    3.4 与此类推...直到全部排序完毕
复制代码

这样就有规可循了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表