LinuxSir.cn,穿越时空的Linuxsir!

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

请问如何知道中文一个文档中一个词出现的次数?

[复制链接]
发表于 2004-11-21 22:51:00 | 显示全部楼层 |阅读模式
可以详细一点说说吗?
发表于 2004-11-22 11:40:29 | 显示全部楼层

提供简单的思路

1、外循环首先利用文件描述符逐步读入文件各行
2、然后利用sed将每行第一个匹配的单词转换成其他字符并重定向到一个临时文件
3、内循环匹配到就设置计数器增值。利用临时文件继续匹配直到此行匹配完成
4、删除临时文件
这看行否,可能这个算法是较直观的算法,不知道还有什么好的shell工具可以简化的。
发表于 2004-11-22 13:26:52 | 显示全部楼层
想了一个毛招计数, cnttest 中出现 abc 的次数,思路是 先把abc
换成 abc\n 起新行,这样每行最多含有一个 abc 出现,然后再把不含 abc
的过滤掉,最后计数即可
$sed 's/abc/&\n/g' cnttest | sed -n '/abc/p' | wc -l
发表于 2004-11-22 13:29:09 | 显示全部楼层
这样搞可能,
ab
c 这种情况统计不到,
还有一种思路是把所有行连接成一行,然后再 abc 后打折,计行
发表于 2004-11-22 19:43:26 | 显示全部楼层

如果能够利用sed的精确匹配这样很好

让他单独做一行
sed 's/abc/\n&\n/g' <filename> |sort  |uniq -dc |awk '$2=="abc" {print $1}'
发表于 2004-11-23 02:24:07 | 显示全部楼层
# cat 1.txt
hello hello hi
hello world.
world
# sed 's/hello/hello\n/' 1.txt|grep 'hello'|wc -l
      3
发表于 2004-11-25 07:27:48 | 显示全部楼层
如果是这样的文件呢:
abc bbb ddd abcabc abcabcabc
abc ccc ddd www abc
abcabc
如果只要abc的话, 次数是3,但上面的方法都不行。用perl 的regexp会简单些。
发表于 2004-11-25 11:11:58 | 显示全部楼层
最初由 yongjian 发表
如果是这样的文件呢:
abc bbb ddd abcabc abcabcabc
abc ccc ddd www abc
abcabc
如果只要abc的话, 次数是3,但上面的方法都不行。用perl 的regexp会简单些。


在sed加上g全局命令可以完成

sed 's/hello/hello\n/g' 1.txt|grep 'hello'|wc -l

# cat 1
abc bbb ddd abcabc abcabcabc
abc ccc ddd www abc
abcabc
# sed 's/abc/abc\n/g' 1|grep 'abc'|wc -l
     10
发表于 2004-11-25 17:15:40 | 显示全部楼层
这样的次数是不对的, 正确的应该是3. 因为作为"abc"这样一个单独字串, 只出现了3次.  abcabc和abcabcabc是另外的词了, 拆开就不对了.
发表于 2004-11-25 20:04:53 | 显示全部楼层
最初由 yongjian 发表
这样的次数是不对的, 正确的应该是3. 因为作为"abc"这样一个单独字串, 只出现了3次.  abcabc和abcabcabc是另外的词了, 拆开就不对了.



兄弟没看清楼主的要求,是中文字符串呀

若是说的是情况是兄弟那样的,可以在前后加一个空白字符来匹配,也可完成要求:cool:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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