我有一个大型 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
答案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'
(匹配完整的键或值)或类似的操作来进行计数。