我可以 grep 到 return 几个文件中出现的真实次数吗?
Can I get grep to return the true number of occurances in several files?
假设您有多个文本文件,并且您想要查看哪个文本包含单词 'the' 的频率。第一个想法似乎是使用 grep
和 -c
选项:
$ grep -Hciw 'the' *
不幸的是,这给出了错误的计数,因为它只对包含单词的每一行计数一次,而不管行中实际有多少个 'the' 实例。
对于单个文件,我可以结合使用选项 -o
和 wc
来获取出现次数:
$ 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]}' *
假设您有多个文本文件,并且您想要查看哪个文本包含单词 'the' 的频率。第一个想法似乎是使用 grep
和 -c
选项:
$ grep -Hciw 'the' *
不幸的是,这给出了错误的计数,因为它只对包含单词的每一行计数一次,而不管行中实际有多少个 'the' 实例。
对于单个文件,我可以结合使用选项 -o
和 wc
来获取出现次数:
$ 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]}' *