有很多方法可以做到这一点,但这是我的解决方案。它使用的命令与您提到的不同,但是通过使用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+) 的所有实例转换为换行符 ( )。\ng
sort按字母顺序组织单词。
uniq -c消除输出列表中的相邻重复项,同时计算有多少。
sort -n对这个输出进行数字排序,产生一个按词频排序的词列表。
sed并且xargs是非常强大的命令,尤其是在结合使用时。但是,正如另一位海报所指出的那样,find它也具有几乎不受约束的力量。tr很有用,但比sed.