【问题标题】:How to count occurrences of a word in all the files of a directory?如何计算一个单词在目录的所有文件中出现的次数?
【发布时间】:2011-05-26 07:20:55
【问题描述】:

我正在尝试计算整个目录中特定单词的出现次数。这可能吗?

例如,有一个包含 100 个文件的目录,所有这些文件中都可能包含单词“aaa”。我如何计算该目录下所有文件中“aaa”的数量?

我尝试了类似的方法:

 zegrep "xception" `find . -name '*auth*application*' | wc -l 

但它不起作用。

【问题讨论】:

    标签: linux unix count find grep


    【解决方案1】:

    grep -roh aaa . | wc -w

    递归地grep当前目录中的所有文件和目录搜索aaa,并且只输出匹配,而不是整行。然后,只需使用wc 来计算有多少字。

    【讨论】:

    • 另外,如果你不想要实际匹配,只想要计数,你可以使用grep -rcP '^aaa$' . 这样可以节省管道并防止嵌入'aaa'
    • @cgledezma 关于-c 的好点,但如果在一行中有两个或多个 searchString 出现,它会失败。
    • MM...确实,我没有注意到它只计算匹配的行数,而不是实际的匹配数。我仍然认为放置单词边界以避免嵌套匹配可能很有用。抱歉,我在之前的评论中放错了:grep -rohP '\baaa\b . | wc -w
    • @cgledezma 当然,单词边界在某些情况下可能很有用
    • 在 osx 上,@cgledezma 的解决方案转换为 grep -rohe '\baaa\b . | wc -w,因为 -P 不可用。
    【解决方案2】:

    基于findgrep的另一种解决方案。

    find . -type f -exec grep -o aaa {} \; | wc -l
    

    应该正确处理包含空格的文件名。

    【讨论】:

    • 完美!我正在使用基于大小的查找,这非常有效
    • @Fredrik :这执行得很完美,但是有没有办法通过避免在同一个文件中对该单词进行多次计数来计算字数?例如:如果单词“aaa”在“file1.txt”中出现了 10 次,但计数应该只增加 1 而不是 10 并且在目录中的其他文件中也是如此。
    • @annunarcist -- 是的,它可以做到。发布一个新问题,我会看看:-)
    • @Fredrik:发布!这是link
    【解决方案3】:

    以最简单的方式使用grep。请尝试grep --help 了解更多信息。


    1. 获取特定文件中的单词计数:

      grep -c <word> <file_name>
      

      例子:

      grep -c 'aaa' abc_report.csv
      

      输出:

      445
      

    1. 获取整个目录中的单词计数:

      grep -c -R <word>
      

      例子:

      grep -c -R 'aaa'
      

      输出:

      abc_report.csv:445
      lmn_report.csv:129
      pqr_report.csv:445
      my_folder/xyz_report.csv:408
      

    【讨论】:

      【解决方案4】:

      让我们使用 AWK!

      $ function wordfrequency() { awk 'BEGIN { FS="[^a-zA-Z]+" } { for (i=1; i<=NF; i++) { word = tolower($i); words[word]++ } } END { for (w in words) printf("%3d %s\n", words[w], w) } ' | sort -rn; }
      $ cat your_file.txt | wordfrequency
      

      这列出了每个单词在提供的文件中出现的频率。如果你想查看你的单词出现的频率,你可以这样做:

      $ cat your_file.txt | wordfrequency | grep yourword
      

      要在目录中的所有文件中查找您的单词出现的次数(非递归),您可以这样做:

      $ cat * | wordfrequency | grep yourword
      

      要在目录(及其子目录)中的所有文件中查找您的单词出现的次数,您可以这样做:

      $ find . -type f | xargs cat | wordfrequency | grep yourword
      

      来源:AWK-ward Ruby

      【讨论】:

        【解决方案5】:
        find .|xargs perl -p -e 's/ /\n'|xargs grep aaa|wc -l
        

        【讨论】:

          【解决方案6】:

          将文件放在一起并 grep 输出:cat $(find /usr/share/doc/ -name '*.txt') | zegrep -ic '\&lt;exception\&gt;'

          如果您想匹配 'exceptional',请不要在单词周围使用 '\'。

          【讨论】:

            【解决方案7】:

            如何开始:

            cat * | sed 's/ /\n/g' | grep '^aaa$' | wc -l
            

            如以下成绩单:

            pax$ cat file1
            this is a file number 1
            
            pax$ cat file2
            And this file is file number 2,
            a slightly larger file
            
            pax$ cat file[12] | sed 's/ /\n/g' | grep 'file$' | wc -l
            4
            

            sed 将空格转换为换行符(您可能希望在sed 's/[ \t]/\n/g' 中包含其他 空格字符以及制表符等)。 grep 只是获取那些包含所需单词的行,然后 wc 为您计算这些行。

            现在可能存在此脚本不起作用的边缘情况,但对于绝大多数情况应该没问题。

            如果你想要一个完整的(不仅仅是一个目录级别),你可以使用类似的东西:

            ( find . -name '*.txt' -exec cat {} ';' ) | sed 's/ /\n/g' | grep '^aaa$' | wc -l
            

            【讨论】:

              【解决方案8】:

              还有一个 grep 正则表达式语法仅用于匹配单词:

              # based on Carlos Campderrós solution posted in this thread
              man grep | less -p '\<'
              grep -roh '\<aaa\>' . | wc -l
              

              有关匹配正则表达式语法的不同单词,请参见:

              man re_format | less -p '\[\[:<:\]\]'
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-06-20
                • 2017-08-14
                • 2023-04-04
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多