使用单个命令行命令,如何搜索数据库中的每个文本文件以查找 10 个最常用的单词?

使用单个命令行命令,如何搜索数据库中的每个文本文件以查找 10 个最常用的单词?

已回答问题解释了如何搜索和排序特定文件名,但是如何对整个目录完成此操作?我有 100 万个文本文件,需要搜索 10 个最常用的单词。

数据库= /data/000/0000000/s##_date/*.txt - /data/999/0999999/s##_data/*txt

我尝试过的所有方法都会导致排序文件名、路径或目录错误。

我使用 grep 取得了一些进展,但部分文件名似乎出现在我的结果中。

grep -r . * | tr -c '[:alnum:]' '[\n*]' | sort | uniq -c | sort -nr | head  -10
output:
 1145 
    253 txt
    190 s01
    132 is
    126 of
    116 the
    108 and
    104 test
     92 with
     84 in

“txt”和“s01”来自文件名,而不是来自文本文件内的文本。我知道有一些方法可以排除“the”等常见单词,但根本不想对文件名进行排序和计数。

答案1

grep如果搜索多个文件,将显示与该模式匹配的每个文件的文件名以及包含匹配项的行,这就是您的情况。

您实际上可以将所有文本文件放在一起并将其作为一个大文档进行处理,而不是使用grep(这是一种鼓舞人心但缓慢的解决方案,无法一次性cat在命令行上处理所有文件) :cat

find /data -type f -name '*.txt' -exec cat {} + |
tr -cs '[:alnum:]' '\n' | sort | uniq -c | sort -nr | head

我添加了-str以便将多个连续的换行符压缩为一个,并将所有非字母数字更改为换行符([\n*]对我来说没有什么意义)。该head命令默认生成十行输出,因此不需要-10(或)。-n 10

find命令查找其文件名与该模式匹配的-type f任何位置的所有常规文件 () 。一次调用尽可能多的文件来连接它们(这就是所做的)。如果您有大量文件,则可能会被多次调用,但这不会影响管道的其余部分,因为它只是从+读取输出流。/data*.txtcat-exec cat {} +catfindcat


为了避免计算空行,您可能需要在管道中的sed '/^ *$/d'第一个行之前或之后插入。sort

相关内容