我可以 grep 到 return 几个文件中出现的真实次数吗?

Can I get grep to return the true number of occurances in several files?

假设您有多个文本文件,并且您想要查看哪个文本包含单词 'the' 的频率。第一个想法似乎是使用 grep-c 选项:

$ grep -Hciw 'the' *

不幸的是,这给出了错误的计数,因为它只对包含单词的每一行计数一次,而不管行中实际有多少个 'the' 实例。

对于单个文件,我可以结合使用选项 -owc 来获取出现次数:

$ grep -owi 'the' file.txt | wc -l

但是如果我将 file.txt 替换为星号或文件列表,我将只能获得累积的点击次数,而不是每个文件的点击次数。

到目前为止我发现的最好的方法是作为一个循环:

for f in *; do
    num=$(grep -oiw 'the' $f | wc -l);
    echo ${f}:${num};
done

但这真的是最好的方法吗?

能否请您尝试以下命令,如果您遇到任何困难,请告诉我。

$ find . -name \*.txt | xargs -I {} sh -c 'echo {}; grep -oiw 'the' {} | wc -l'

通过此命令,输出将采用以下格式:

./file-1.txt
4
./file-2.txt
4

使用awk:

grep  -Hoiw 'the' * |awk -F\: '{a[]++}END{for (i in a){print i":"a[i]}}'

这是一种使用 gnu awk 的方法(gnu 由于 RS 中的多个字符)

awk -v RS=" |\n" '/\<[Tt]he\>/ {a[FILENAME]++} END {for (i in a) print i,a[i]}' *

它会打印这样的结果:

file1 22
file3 4

计算单词the的个数,并以文件名作为引用存储在数组中。


这应该适用于所有 awk

awk '{for (i=1;i<=NF;i++) if (tolower($i)~/^the[.,?]*$/) a[FILENAME]++} END {for (i in a) print i,a[i]}' *