如何使用命令行计算文本文件中某个单词出现的次数?

如何使用命令行计算文本文件中某个单词出现的次数?

我有一个大型 JSON 文件,只有一行,我想使用命令行来计算文件中某个单词出现的次数。我怎样才能做到这一点?

答案1

$ tr ' ' '\n' < FILE | grep WORD | wc -l

wheretr用换行符替换空格,grep过滤所有与 WORD 匹配的结果行​​并对wc剩余行进行计数。

人们甚至可以wc使用 grep 选项保存该部分-c

$ tr ' ' '\n' < FILE | grep -c WORD

-c选项由 POSIX 定义。

如果不能保证单词之间有空格,则必须使用其他字符(作为分隔符)来替换。例如替代tr零件是

tr '"' '\n'

或者

tr "'" '\n'

如果你想替换双引号或单引号。当然,您也可以使用tr一次替换多个字符(考虑不同类型的空格和标点符号)。

如果您需要计算 WORD,但不需要计算 prefixWORD、WORDsuffix 或 prefixWORDsuffix,则可以将 WORD 模式括在行首/行尾标记中:

grep -c '^WORD$'

在我们的上下文中,这相当于单词开始/结束标记:

grep -c '\<WORD\>'

答案2

使用 GNU grep 可以实现以下效果:grep -o '\<WORD\>' | wc -l

-o将每行的每个匹配部分打印在单独的行上。

\<断言单词的开头并\>断言单词的结尾(类似于 Perl 的\b),因此这可以确保您不会匹配单词中间的字符串。

例如,

$python -c '导入这个' | grep '\<一个\>'
应该有——并且最好只——显而易见的方法。
命名空间是好主意——让我们多做一些吧!
$python -c '导入这个' | grep -o '\<一个\>'



$python -c '导入这个' | grep -o '\<一个\>' |厕所-l
3

答案3

这不幸的是不起作用与 GNU coreutils.

grep -o -c WORD file

如果它可以在您的平台上运行,那么它就是一个优雅且相当直观的解决方案;但GNU 人仍在思考。

答案4

根据您是要匹配 JSON 数据的键中的单词还是值中的单词,您可能只想从数据中提取键或值。否则,如果某些单词同时作为键和值出现,您可能会计算太多次。

要提取所有密钥:

jq -r '..|objects|keys[]' <file.json

这会递归地测试当前事物是否是对象,如果是,则提取键。输出将是一个键列表,每行一个。

要提取所有值:

jq -r '..|scalars' <file.json

这以类似的方式工作,但步骤更少。

然后,您可以通过管道输出上述内容grep -c 'PATTERN'(以将某些模式与键或值匹配),或grep -c -w -F 'WORD'(以匹配单词在键或值中),或grep -c -x -F 'WORD'(匹配完整的键或值)或类似的操作来进行计数。

相关内容