鉴于包含文本的文件,我想计算字符串“ABCDXYZ”的出现次数?
$ cat file.txt
foo
bar
foo
bar
baz
baz
bug
bat
foo
bar
so
on
and
so
on
foo
我们算一下foo
!
答案 0 :(得分:3)
很多时候,我看到人们使用以下内容来计算单词:
$ grep -o 'foo' file.txt | wc -l
以下是一些示例:1,2,3甚至this youtube video。
这真是一个糟糕的方式,原因如下:
man grep
BSD grep(NetBSD,OpenBSD,FreeBSD)或GNU grep -c
的选项。
NetBSD手册页非常清楚地描述了这些选项:-c, --count Suppress normal output; instead print a count of matching lines for each input file. With the -v, --invert-match option (see below), count non-matching lines.
您只能使用一个命令:
$ grep foo -c file.txt
不仅你可以,你应该,你将通过阅读手册页来了解自己很多的搜索时间,并了解你手头的工具!
速度加成
你也可以让你的grep
更快,因为管道很贵。
与使用选项-c
相比,管道上方显示的短文件慢2倍:
$ time grep foo -c file.txt
4
real 0m0.001s
user 0m0.000s
sys 0m0.001s
$ time grep -o 'foo' file.txt | wc -l
4
real 0m0.002s
user 0m0.000s
sys 0m0.003s
在大文件上,这可能更为重要。在这里,我将文件复制到更长的时间十万次:
$ for i in `seq 1 300000`; do cat file.txt >> largefile.txt; done
^C
$ wc -l largefile.txt
1111744 largefile.txt
现在这里使用管道的速度有多慢:
$ time grep -o foo largefile.txt | wc -l
277936
real 0m0.216s
user 0m0.214s
sys 0m0.010s
以下是使用grep的速度有多快:
$ time grep -c foo largefile.txt
277936
real 0m0.032s
user 0m0.028s
sys 0m0.004s
这些基准测试是在具有Core i5
和大量RAM的机器上完成的,它将在嵌入式设备上显着,具有很少的RAM和CPU资源。
总之,不要在不需要的地方使用管道。 UNIX工具通常具有重叠的功能。了解您的工具,了解如何使用它们!
要计算文件中某个单词的出现次数,只需使用:
$ grep -c <word> <filename>
答案 1 :(得分:0)
如果要概括统计所有字词,请使用:
sort file.txt | uniq -c