这个已回答的问题解释了如何搜索和排序特定文件名,但是您将如何为整个目录完成此操作?我有 100 万个文本文件,我需要搜索十个最常用的单词。
数据库= /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”这样的常用词,但宁愿根本不对文件名进行排序和计数。
grep
如果搜索了多个文件,将显示与模式匹配的每个文件的文件名以及包含匹配项的行,这就是您的情况。而不是使用
grep
(这是一种灵感但缓慢的解决方案,无法cat
一次性处理命令行上的所有文件),您实际上可以cat
将所有文本文件放在一起并将其作为一个大文档处理,如下所示:我已经添加
-s
,tr
以便将多个连续的换行符压缩为一个,并且我将所有非字母数字更改为换行符([\n*]
对我来说没有什么意义)。该head
命令默认产生十行输出,因此不需要-10
(or )。-n 10
该命令在其文件名与模式匹配的任何位置
find
查找所有常规文件 ( ) 。一次尽可能多地调用这些文件来连接它们(这就是这样做的)。如果您有大量文件,可能会多次调用,但这不会影响管道的其余部分,因为它只是从+读取输出流。-type f
/data
*.txt
cat
-exec cat {} +
cat
find
cat
为避免计算空行,您可能希望在管道中
sed '/^ *$/d'
的第一个之前或之后插入。sort