如何统计目录中所有文件中单词的出现次数?
我正在计算整个目录中的特定单词出现次数。 这可能吗?
例如,有一个目录有100个文件,其中的所有文件可能都有“aaa”这个词。 如何计算该目录下所有文件中的“aaa”数?
我尝试了这样的:
zegrep "xception" `find . -name '*auth*application*' | wc -l
但它不工作。
grep -roh aaa . | wc -w
greprecursion地search当前目录中的所有文件和目录,并输出匹配结果,而不是整行。 然后,只需使用wc
来统计有多less单词。
另一个基于find
和grep
解决scheme。
find . -type f -exec grep -o aaa {} \; | wc -l
应该正确处理文件名与他们的空格。
让我们使用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
要查找目录中所有文件的发生(非recursion),可以这样做:
$ cat * | wordfrequency | grep yourword
要查找目录中的所有文件(以及它的子目录)中的单词出现情况,可以这样做:
$ find . -type f | xargs cat | wordfrequency | grep yourword
来源: AWK-鲁德
find .|xargs perl -p -e 's/ /\n'|xargs grep aaa|wc -l
以最简单的方式使用grep
。 尝试grep --help
帮助更多的信息。
-
要计算特定文件中的单词数量:
grep -c <word> <file_name>
例:
grep -c 'aaa' abc_report.csv
输出:
445
-
要查看整个目录中的单词数量:
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
cat文件一起grep输出: cat $(find /usr/share/doc/ -name '*.txt') | zegrep -ic '\<exception\>'
cat $(find /usr/share/doc/ -name '*.txt') | zegrep -ic '\<exception\>'
如果你想“特殊”匹配,不要使用单词“\”和“\>”。
从如何开始:
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
还有一个grep正则expression式只用于匹配单词:
# based on Carlos Campderrós solution posted in this thread man grep | less -p '\<' grep -roh '\<aaa\>' . | wc -l
对于与正则expression式语法不同的单词,请参阅:
man re_format | less -p '\[\[:<:\]\]'