分页: 1 / 1
求助:字符串处理
发表于 : 2012-02-07 17:03
由 halfwolf
有如下两个需求,请各位大牛帮忙,谢谢!
------------------------------------------
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分钟左右,故需要寻求高效的处理方式。
Re: 求助:字符串处理
发表于 : 2012-02-07 17:23
由 枫叶饭团
个人感觉这种事用bash就是找虐
Re: 求助:字符串处理
发表于 : 2012-02-07 17:27
由 eexpress
没懂要求。
反正你学perlre是正确的。
Re: 求助:字符串处理
发表于 : 2012-02-07 17:45
由 halfwolf
谢谢!
其实,目的只有一个,我想分析一下6级词汇库里的单词那些是字母完全一样,唯一不同的是排序方法。
譬如下面词汇就属于这类
----------------------------------------------
asleep
elapse vi.(时间)过去,消逝
----------------------------------------------
backward
drawback n.退款;妨碍;弊端
----------------------------------------------
battle
tablet n.碑,匾;药片
----------------------------------------------
below
elbow n.肘,肘部;弯管vt.用肘挤,挤进
方法不限,用perl也可以,最近正在学perl,还没入门!
Re: 求助:字符串处理
发表于 : 2012-02-07 18:17
由 HuntXu
第一個,參數是兩個單詞,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
Re: 求助:字符串处理
发表于 : 2012-02-07 18:42
由 josephyoung
第2问:
代码: 全选
awk '{a="";split($0,A,"");asort(A);for(i=0;i++<length(A);)a=a A[i];print a}' file
有了第二问,第一问就很简单了,不过没看懂你第一问具体要搞什么
Re: 求助:字符串处理
发表于 : 2012-02-07 19:03
由 josephyoung
第一题:
[python]print sorted(a) == sorted(b) and 'same' or 'different'
[/python]
第二题:
[python]print "".join(sorted(word))
[/python]
Re: 求助:字符串处理
发表于 : 2012-02-07 19:11
由 枫叶饭团
josephyoung 写了:第一题:
[python]print sorted(a) == sorted(b) and 'same' or 'different'
[/python]
第二题:
[python]print "".join(sorted(word))
[/python]
我就知道用python简单,可惜我把这部分跳过去了...

Re: 求助:字符串处理
发表于 : 2012-02-07 22:54
由 fnan
a=bok;b=boko;[[ $(grep -o '.' <<<$a$b|sort|sed -r 'N;s/(.)\n\1//') ]] && echo different || echo same
different
#都在说什么?
#用什么都正确,只不过需要一点算法。
Re: 求助:字符串处理
发表于 : 2012-02-08 0:52
由 fnan
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
#大概这样吧。
Re: 求助:字符串处理
发表于 : 2012-02-08 13:54
由 tangboyun
用sort是低效的方式,这里有个特殊的地方,因为都是单词,而且不需要区分大小写,所以一个26字符长的数组即可储存一个单词的所有信息。每个词只要扫一遍即可,然后比较数组,只要有一位不同即可跳出。
Re: 求助:字符串处理
发表于 : 2012-02-08 14:28
由 halfwolf
谢谢诸位,都是好方法!
其中的精妙我要慢慢体会。
Re: 求助:字符串处理
发表于 : 2012-02-08 20:32
由 fnan
tangboyun 写了:用sort是低效的方式,这里有个特殊的地方,因为都是单词,而且不需要区分大小写,所以一个26字符长的数组即可储存一个单词的所有信息。每个词只要扫一遍即可,然后比较数组,只要有一位不同即可跳出。
只运行一次的话很高效的,要多次运行的话用awk更高效。
Re: 求助:字符串处理
发表于 : 2012-02-08 20:52
由 fnan
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也对数十万单词进行了一次排序。
Re: 求助:字符串处理
发表于 : 2012-02-08 21:39
由 fnan
........
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秒。