如何计算目录的所有文件中单词的出现次数?

时间:2011-05-26 07:20:56

标签: linux unix count find grep

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

例如,假设有一个包含100个文件的目录,其中所有文件的文件中都可能包含“aaa”字样。我如何计算该目录下所有文件中“aaa”的数量?

我尝试过类似的事情:

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

但它不起作用。

8 个答案:

答案 0 :(得分:87)

grep -roh aaa . | wc -w

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

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:3)

让我们使用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

答案 3 :(得分:2)

以最简单的方式使用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 :(得分:1)

find .|xargs perl -p -e 's/ /\n'|xargs grep aaa|wc -l

答案 5 :(得分:0)

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

如果您想要“特殊”匹配,请不要使用'\&lt;'和'\&gt;'围绕这个词。

答案 6 :(得分:0)

如何开始:

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

答案 7 :(得分:0)

还有一个仅用于匹配单词的grep regex语法:

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

对于匹配正则表达式语法的其他单词,请参阅:

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