Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何使用shell计算单词在文件中出现的次数?_Linux_Bash_Shell_Grep_Bsd - Fatal编程技术网

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

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 不仅你可以,而且你应该

给定一个包含文本的文件,我想计算字符串“ABCDXYZ”的出现次数


让我们数一数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