如果您不需要详细报告,那么这是@hek2mgl答案的更快版本:
IF
while read word; do
grep -o $word input.txt
done < words.txt | wc -l
如果您需要详细的报告,这里有另一个版本:
while read word; do
grep -o "$word" input.txt
done < words.txt | sort | uniq -c | awk '{ total += $1; print } END { print "total:", total }'
最后,如果您想匹配整个单词,则需要在 grep
中使用更严格的模式:
while read word; do
grep -o "\<$word\>" input.txt
done < words.txt | sort | uniq -c | awk '{ total += $1; print } END { print "total:", total }'
然而,这种方式下,模式banana
将无法匹配文本中的bananas
。如果你想让banana
匹配bananas
,你可以将模式匹配单词开头,像这样:
while read word; do
grep -o "\<$word" input.txt
done < words.txt | sort | uniq -c | awk '{ total += $1; print } END { print "total:", total }'
我不确定如果我们同时使用多个单词调用grep
是否会更快:
paste -d'|' - - - < words.txt | sed -e 's/ //g' -e 's/\|*$//' | while read words; do
grep -oE "\<($words)\>" input.txt
done
这将每次使用
grep
查找 3 个单词。您可以尝试添加更多的
-
让
paste
一次匹配更多的单词,例如:
paste -d'|' - - - - - - - - - - < words.txt | ...
无论如何,我想知道哪个解决方案是最快的,这个还是@HakonHægland提供的awk
解决方案。