如何使用shell计算文件在文件中出现的次数?

时间:2015-07-02 21:28:39

标签: linux bash shell grep bsd

鉴于包含文本的文件,我想计算字符串“ABCDXYZ”的出现次数?

$ cat file.txt 
foo
bar 
foo
bar
baz
baz
bug
bat
foo
bar
so 
on 
and
so 
on
foo

我们算一下foo

2 个答案:

答案 0 :(得分:3)

很多时候,我看到人们使用以下内容来计算单词:

$ grep -o 'foo' file.txt | wc -l

以下是一些示例:123甚至this youtube video
这真是一个糟糕的方式,原因如下:

  1. 它显示您从未阅读man grep BSD grep(NetBSDOpenBSDFreeBSD)或GNU grep
  2. 所有这些实现都为您提供了计算事物-c的选项。 NetBSD手册页非常清楚地描述了这些选项:
  3.    -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