有很多方法可以做到这一点,但这是我的解决方案。它使用的命令与您提到的不同,但是通过使用sed
和最终的排序,它可能会产生更理想的输出。
find . -type f -print0 | xargs -0 cat | sed 's/[[:punct:]]//g' | sed -r 's/\s+/\n/g' | sort | uniq -c | sort -n
find . -type f -print0
将从当前目录向下递归搜索所有文件夹和文件。-type f
将只返回文件。-print0
将使用特殊\0
字符来结束文件名,以便空格不会与管道中的下一个命令混淆。
xargs
接受输入并将其转换为命令的参数,在本例中为cat
. cat
将打印作为参数提供给它的所有文件的内容。告诉 xargs 它的-0
输入由特殊\0
字符而不是空格分隔。
sed
是一个模式匹配流编辑器。第一个sed
命令使用该模式替换( s
) 所有标点符号,并用任何内容替换标点符号。[[:punct:]]
它匹配给定给它的每一行中的所有此类模式(g
)。
第二个 sed 命令通过输入字符串 ( ) 将一行中 1 个或多个空格 ( \s+
) 的所有实例转换为换行符 ( )。\n
g
sort
按字母顺序组织单词。
uniq -c
消除输出列表中的相邻重复项,同时计算有多少。
sort -n
对这个输出进行数字排序,产生一个按词频排序的词列表。
sed
并且xargs
是非常强大的命令,尤其是在结合使用时。但是,正如另一位海报所指出的那样,find
它也具有几乎不受约束的力量。tr
很有用,但比sed
.