求助:字符串处理

sh/bash/dash/ksh/zsh等Shell脚本
回复
halfwolf
帖子: 40
注册时间: 2012-01-28 21:27

求助:字符串处理

#1

帖子 halfwolf » 2012-02-07 17:03

有如下两个需求,请各位大牛帮忙,谢谢!
------------------------------------------
1、如何判断两个字符串是否含有相同字母
譬如
oobk
kboo
okob
koob
与book相同


bok
handbook
boot
与book不同

2、如何对一个字符串中的字符进行重新排序
abandon
abbreviation
abide
ability
able
abnormal
aboard
abolish
about
above
处理后变为
aabdnno
aabbeiinortv
abdei
abiilty
abel
aablmnor
aabdor
abhilos
abotu
abeov

关于问题2,我有一个非常笨拙的处理办法,如下
echo $Curword | sed 's/[a-z]/& /g' |xargs -n1 |sort |xargs |sed 's/ //g'
刚刚测试了一下,处理6000个字符串需要8分钟左右,故需要寻求高效的处理方式。
头像
枫叶饭团
帖子: 14683
注册时间: 2010-06-16 1:05
系统: Mac OS X
来自: Tencent
联系:

Re: 求助:字符串处理

#2

帖子 枫叶饭团 » 2012-02-07 17:23

个人感觉这种事用bash就是找虐
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 求助:字符串处理

#3

帖子 eexpress » 2012-02-07 17:27

没懂要求。

反正你学perlre是正确的。
● 鸣学
halfwolf
帖子: 40
注册时间: 2012-01-28 21:27

Re: 求助:字符串处理

#4

帖子 halfwolf » 2012-02-07 17:45

谢谢!
其实,目的只有一个,我想分析一下6级词汇库里的单词那些是字母完全一样,唯一不同的是排序方法。
譬如下面词汇就属于这类
----------------------------------------------
asleep
elapse vi.(时间)过去,消逝
----------------------------------------------
backward
drawback n.退款;妨碍;弊端
----------------------------------------------
battle
tablet n.碑,匾;药片
----------------------------------------------
below
elbow n.肘,肘部;弯管vt.用肘挤,挤进


方法不限,用perl也可以,最近正在学perl,还没入门!
头像
HuntXu
帖子: 5776
注册时间: 2007-09-29 3:09

Re: 求助:字符串处理

#5

帖子 HuntXu » 2012-02-07 18:17

第一個,參數是兩個單詞,samechars("book", "koob")這樣子,1是相同
[perl]
sub samechars
{
my $word = join "", sort split //, shift;
return 1 unless $word cmp join "", sort split //, shift;
0;
}
[/perl]
第二個,整個單詞表變數組
[perl]
foreach(@words)
{
push @sorted_words, join "", sort split //;
}
[/perl]
文件的話直接
$ perl -ne 'chomp; print join "", sort split //;print "\n"' word
HUNT Unfortunately No Talent...
头像
josephyoung
帖子: 158
注册时间: 2011-11-05 18:53
来自: 南极圈

Re: 求助:字符串处理

#6

帖子 josephyoung » 2012-02-07 18:42

第2问:

代码: 全选

awk '{a="";split($0,A,"");asort(A);for(i=0;i++<length(A);)a=a A[i];print a}' file
有了第二问,第一问就很简单了,不过没看懂你第一问具体要搞什么
头像
josephyoung
帖子: 158
注册时间: 2011-11-05 18:53
来自: 南极圈

Re: 求助:字符串处理

#7

帖子 josephyoung » 2012-02-07 19:03

第一题:
[python]print sorted(a) == sorted(b) and 'same' or 'different'
[/python]
第二题:
[python]print "".join(sorted(word))
[/python]
头像
枫叶饭团
帖子: 14683
注册时间: 2010-06-16 1:05
系统: Mac OS X
来自: Tencent
联系:

Re: 求助:字符串处理

#8

帖子 枫叶饭团 » 2012-02-07 19:11

josephyoung 写了:第一题:
[python]print sorted(a) == sorted(b) and 'same' or 'different'
[/python]
第二题:
[python]print "".join(sorted(word))
[/python]
我就知道用python简单,可惜我把这部分跳过去了... :em06
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 求助:字符串处理

#9

帖子 fnan » 2012-02-07 22:54

a=bok;b=boko;[[ $(grep -o '.' <<<$a$b|sort|sed -r 'N;s/(.)\n\1//') ]] && echo different || echo same
different
#都在说什么?
#用什么都正确,只不过需要一点算法。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 求助:字符串处理

#10

帖子 fnan » 2012-02-08 0:52

kose3@kose3-laptop:~$ cat file
----------------------------------------------
asleep
elapse vi.(时间)过去,消逝
----------------------------------------------
backward
drawback n.退款;妨碍;弊端
----------------------------------------------
battle
tablet n.碑,匾;药片
----------------------------------------------
below
elbow n.肘,肘部;弯管vt.用肘挤,挤进
kose3@kose3-laptop:~$ A=1;B=A;C=B;eval echo \$${!C}
1
kose3@kose3-laptop:~$ cat file
----------------------------------------------
asleep
elapse vi.(时间)过去,消逝
----------------------------------------------
backward
drawback n.退款;妨碍;弊端
----------------------------------------------
battle
tablet n.碑,匾;药片
----------------------------------------------
below
elbow n.肘,肘部;弯管vt.用肘挤,挤进
sed -r '/^-+/d;s/(\w+).*/\1/' file|awk '{split($0,a,"");asort(a);for(i in a){printf a};print " "$0}'|sort -k1|awk '{if(NR !=1 && v != $1){print c;c=0};v=$1;c++;print $2}END{print c}'
backward
drawback
2
asleep
elapse
2
battle
tablet
2
below
elbow
2
#大概这样吧。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
tangboyun
帖子: 701
注册时间: 2009-07-25 1:57
联系:

Re: 求助:字符串处理

#11

帖子 tangboyun » 2012-02-08 13:54

用sort是低效的方式,这里有个特殊的地方,因为都是单词,而且不需要区分大小写,所以一个26字符长的数组即可储存一个单词的所有信息。每个词只要扫一遍即可,然后比较数组,只要有一位不同即可跳出。
https://github.com/tangboyun
http://tangboyun.is-programmer.com/
提问的智慧————Eric Steven Raymond
回答的智慧————Andrew Clarke
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。
halfwolf
帖子: 40
注册时间: 2012-01-28 21:27

Re: 求助:字符串处理

#12

帖子 halfwolf » 2012-02-08 14:28

谢谢诸位,都是好方法!
其中的精妙我要慢慢体会。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 求助:字符串处理

#13

帖子 fnan » 2012-02-08 20:32

tangboyun 写了:用sort是低效的方式,这里有个特殊的地方,因为都是单词,而且不需要区分大小写,所以一个26字符长的数组即可储存一个单词的所有信息。每个词只要扫一遍即可,然后比较数组,只要有一位不同即可跳出。
只运行一次的话很高效的,要多次运行的话用awk更高效。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 求助:字符串处理

#14

帖子 fnan » 2012-02-08 20:52

kose-1@kose-1-desktop:~$ wc -l file2
599988 file2
#file2是把file扩展为约60万行。
kose-1@kose-1-desktop:~$ time sed -r '/^-+/d;s/(\w+).*/\1/' file2|awk '{split($0,a,"");asort(a);for(i in a){printf a};print " "$0}'|sort -k1|awk '{if(NR !=1 && v != $1){print c;c=0};v=$1;c++}END{print c}'
99998
99998
99998
99998

real 0m13.160s
user 0m12.750s
sys 0m0.140s
#去除打印单词处理时间约13秒,应该是可以接受的范围。(不同的具体情况用不同的具体算法以提高效率是需要的)
#其中已经对约40万单词分别进行了字母排序,sort也对数十万单词进行了一次排序。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 求助:字符串处理

#15

帖子 fnan » 2012-02-08 21:39

........
aeelps
aabcdkrw
aabcdkrw
abeltt
abeltt
below
below

real 0m40.398s
user 0m15.050s
sys 0m4.510s
kose-1@kose-1-desktop:~$ time sed -r '/^-+/d;s/(\w+).*/\1/' file2|awk '{c=split($0,a,"");asort(a);for(i=1;i<=c;i++){printf a};printf "\n"}'
#实测处理60万行40万单词的文件每个单词字母排序包括打印约40秒。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
回复