日期:2014-05-16  浏览次数:20688 次

百度笔试题——SHELL
如何把两个文件中相同的单词,去除掉。

------解决方案--------------------
我大概说说看我的想法,也许不是最优,权当抛砖引玉了!
 
先考虑两个文件自身没有相同单词的情况~~~
第一步,分别读文件,挑出单词,将每个单词作为一个数组成员存入数组,可以通过检查字符的ASCII值是否在65~90和97~122之间找出空格和逗号之类可以区分单词的字符(同时这里需要将65~90之间的大写字母的ASCII值全部+32变成小写字母);
第二步,对2个字符串数组分别进行从小到大排序,用strcmp函数和冒泡可以实现;
第三步,从第一个成员开始比较2个数组,如果str1[0]比str2[0]大,那么str1[0]再与str2[1]比较,反之则str1[1]与str[0]比较,如果2个成员相等则删除;
简单起见:
char str1[],str2[];
int i=0,j=0;
/*前面读文件挑单词时已知str1[]成员数量为m,str2[]成员数量为n*/
for ( ;i<=m&&j<=n ; )
{
if (strcmp(str1[i],str2[j])==0)
{/*删除str1[i]和str2[j]*/}
else if (strcmp(str1[i],str2[j])>0)
{j++;}
else if (strcmp(str1[i],str2[j])<0)
{i++;}
}
 
如果2个文件自身有相同单词,则需要在str1[i]==str2[j]的情况下,比较str1[i]和str1[i+1],str2[j]和str2[j+1],如果不相等则删除该单词;如果相等则继续比较一直到不相等为止,然后删除相等的单词~~~
------解决方案--------------------
以下上文件3.sh的内容
对本题做出了回答 诚请各位大侠多多指教

>lwp1
for a in $(cat A)
do
echo $a>>lwp1
done

>lwp2
for b in $(cat B)
do
echo $b>>lwp2
done

>comf
for c in $(cat lwp1)
do
for d in $(cat lwp2)
do
if [ "$c" = "$d" ]
then echo $c>>comf
fi
done
done

>ptf1 
>ptf2

diff lwp1 comf|grep "\<"|tr "<" "\0" > ptf1
diff lwp2 comf|grep "\<"|tr "<" "\0" > ptf2

echo "ptf1 ---->>>> A "
echo "ptf2 ---->>>> B "