Linux 如何使用shell计算单词在文件中出现的次数?
给定一个包含文本的文件,我想计算字符串“ABCDXYZ”的出现次数Linux 如何使用shell计算单词在文件中出现的次数?,linux,bash,shell,grep,bsd,Linux,Bash,Shell,Grep,Bsd,给定一个包含文本的文件,我想计算字符串“ABCDXYZ”的出现次数 让我们数一数foo 很多时候,我看到人们用以下方法数词: $ grep -o 'foo' file.txt | wc -l 这里有几个例子:,甚至。 这确实是一种糟糕的方式,原因如下: 它表明您从未阅读过man grepBSD grep(,)或 所有这些实现都为您提供了计数选项-c。 NetBSD手册页非常清楚地描述了这些选项: 您可以只使用一个命令: $ grep foo -c file.txt 不仅你可以,而且你应该
让我们数一数foo 很多时候,我看到人们用以下方法数词:
$ grep -o 'foo' file.txt | wc -l
这里有几个例子:,甚至。这确实是一种糟糕的方式,原因如下:
man grep
BSD grep(,)或-c
。
NetBSD手册页非常清楚地描述了这些选项: $ grep foo -c file.txt
不仅你可以,而且你应该,通过阅读手册页和了解手中的工具,你将节省大量的搜索时间
速度奖励
您还可以使grep
s更快,因为管道非常昂贵。
其中一个管道上方显示的短文件比使用选项-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
这些基准测试在具有核心i5
和充足RAM的机器上进行,它将在具有很少RAM和CPU资源的嵌入式设备上进行
总之,不要在不需要管道的地方使用管道。UNIX工具通常具有重叠的功能。了解你的工具,了解如何使用它们
要计算文件中某个单词的出现次数,只需使用:
$ grep -c <word> <filename>
$grep-c
如果您想概括计算所有单词,请使用:
sort file.txt | uniq -c
@DavidC.Rankin,想象一下一个法律被写成手册页的世界,你会喜欢吗?上面提到的将计算
foobar
的出现次数,就好像它找到了foo
这个词一样。这是可取的吗?你在找单词还是字符串?您的问题可以互换使用这些术语,但它们非常不同,并且您使用的grep命令不会搜索其中任何一个,它会搜索regexp,因此如果您希望查找文件中存在的字符串f.o
和foo
,那么foo
将被计算在内。有关如何搜索单词和字符串的详细信息,请参见grep
手册页。@EdMorton,您可以随时使用正则表达式优化搜索。重点是让人们意识到“c”。我只是看到太多人使用管道“wc”。编辑你的问题,将字符串foobar
包含在内,并提供预期的输出。
$ grep -c <word> <filename>
sort file.txt | uniq -c