如何统计词组?

pumk
如何统计词组?

用 cat file | tr ' ' '/n'  | grep -c 'word'  可以统计某个单词的数量,但是如果我想统计的是由2个单词组成的词组呢? 比如一个文件是这样的:
abc def kkk ggg.kkk ggg
kkk ggg 777 666

现在我想统计 kkk ggg 的数量,该怎么办呢?

[color=Red][size=3]注意,第一行的ggg 和kkk之间有个点"."[/size][/color]

[[i] 本帖最后由 pumk 于 2008-6-28 16:48 编辑 [/i]]

waker
grep -Fo 'kkk ggg' file |wc -l

pumk
我这个unix的grep 没有参数 o 哦

blackold
回复 #1 pumk 的帖子

grep -c word显示的是匹配单词word行数.
grep -o word | wc -l   可以得到单词word出现的次数.
grep -o 'kkk ggg' | wc -l

blackold
回复 #3 pumk 的帖子

统计:
[code]$ echo "beatutiful girl pretty woman girl" | xargs -n1|sort|uniq -c
      1 beatutiful
      2 girl
      1 pretty
      1 woman
[/code]

pumk
[quote]原帖由 [i]blackold[/i] 于 2008-6-28 16:38 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8692644&ptid=1182912][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
统计:
$ echo "beatutiful girl pretty woman girl" | xargs -n1|sort|uniq -c
      1 beatutiful
      2 girl
      1 pretty
      1 woman
[/quote]


比较简练,但是还是不能统计一个词组出现的次数呢。

err7dd
try:

sed 's/kkk ggg/&/n/g' file|sed -n '/kkk ggg/p' |wc -l

blackold
LZ,已经给你回信,对于词组,比如 "your phrase"
[code]
sed 's/^your phrase//n&/g; s/[^a-zA-Z0-9_]/(your phrase/)//n/1/g; s/your phrase$/&/n/g; s//(your phrase/)[^a-zA-Z0-9_]//1/n/g' urfile | grep -c "/<your phrase/>"
[/code]

[[i] 本帖最后由 blackold 于 2008-6-28 17:45 编辑 [/i]]

pumk
各位,还是不行啊,你们把我的内容贴到一个文件中试试看?
用你们的方法,结果都是2,但是我想得到的是3。

walkerxk
[quote]原帖由 [i]pumk[/i] 于 2008-6-28 17:32 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8692889&ptid=1182912][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
各位,还是不行啊,你们把我的内容贴到一个文件中试试看?
用你们的方法,结果都是2,但是我想得到的是3。 [/quote]
七楼的不行?

blackold
回复 #9 pumk 的帖子

行尾时没有匹配,改了一个,再试试。

tigerz
试试

tr '.' ' ' < file | sed -n "s//(kkk ggg/)//n/1/n/gp" | grep "kkk ggg" | wc -l

springwind426
[code]
sed ':a;$!{N;s//n//;ba};s/kkk ggg/&/n/g;s//n[^/n]*$//' 数据文件 | wc -l
[/code]

思路是把所有的行都合并,然后把所有要查找的词用/n来替换,最后把最后一个/n到行尾部分删除,这样统计出来的行数就是词组出现的次数了。

blackold
不考虑跨行情形。
使用awk:
[code]
$ awk '{ gsub(//<your phrase/>/,"/n&/n") ;print}' urfile | sed '/^ *$/d' | sort | uniq -c |sort [/code]

urfile样本:
[quote]
ayour phrase your phrase
abc def your phrase.your phrase
your phrase.your phrase
your phrase.your phrasek
your phrase
your phrase 777 666
[/quote]

输出:
[quote]
     1  777 666
     1 .your phrasek
     1 abc def
     1 ayour phrase
     2 .
     8 your phrase[/quote]

[[i] 本帖最后由 blackold 于 2008-6-30 12:03 编辑 [/i]]

pumk
[quote]原帖由 [i]blackold[/i] 于 2008-6-30 12:00 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8701677&ptid=1182912][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
不考虑跨行情形。
使用awk:

$ awk '{ gsub(///,"/n&/n") ;print}' urfile | sed '/^ *$/d' | sort | uniq -c |sort

urfile样本:


输出:
[/quote]


确实可以了。谢谢了。