这已回答问题解释了如何搜索和排序特定文件名,但是如何对整个目录完成此操作?我有 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
我添加了-s
,tr
以便将多个连续的换行符压缩为一个,并将所有非字母数字更改为换行符([\n*]
对我来说没有什么意义)。该head
命令默认生成十行输出,因此不需要-10
(或)。-n 10
该find
命令查找其文件名与该模式匹配的-type f
任何位置的所有常规文件 () 。一次调用尽可能多的文件来连接它们(这就是所做的)。如果您有大量文件,则可能会被多次调用,但这不会影响管道的其余部分,因为它只是从+读取输出流。/data
*.txt
cat
-exec cat {} +
cat
find
cat
为了避免计算空行,您可能需要在管道中的sed '/^ *$/d'
第一个行之前或之后插入。sort