myt*_*thz 49 command-line grep bash json
我有一个位于一行的大型 JSON 文件,我想使用命令行来计算文件中某个单词出现的次数。我怎样才能做到这一点?
max*_*zig 51
$ tr ' ' '\n' < FILE | grep WORD | wc -l
Run Code Online (Sandbox Code Playgroud)
wheretr用换行符替换空格,grep过滤所有与 WORD 匹配的结果行并wc计算剩余的行。
甚至可以wc使用-cgrep 选项保存零件:
$ tr ' ' '\n' < FILE | grep -c WORD
Run Code Online (Sandbox Code Playgroud)
该-c选项由 POSIX 定义。
如果不能保证单词之间有空格,则必须使用其他字符(作为分隔符)来替换。例如替代tr零件是
tr '"' '\n'
Run Code Online (Sandbox Code Playgroud)
或者
tr "'" '\n'
Run Code Online (Sandbox Code Playgroud)
如果要替换双引号或单引号。当然,您也可以使用tr一次替换多个字符(想想不同种类的空格和标点符号)。
如果您需要计算 WORD 而不是 prefixWORD、WORDsuffix 或 prefixWORDsuffix,您可以将 WORD 模式包含在行首/行尾标记中:
grep -c '^WORD$'
Run Code Online (Sandbox Code Playgroud)
在我们的上下文中,这相当于单词开始/结束标记:
grep -c '\<WORD\>'
Run Code Online (Sandbox Code Playgroud)
eph*_*ent 27
使用 GNU grep,这有效: grep -o '\<WORD\>' | wc -l
-o 在单独的行上打印每行的每个匹配部分。
\<断言单词的开头并\>断言单词的结尾(类似于 Perl 的\b),因此这可确保您不匹配单词中间的字符串。
例如,
$ python -c '导入这个' | grep '\<一个\>' 应该有一种——最好只有一种——明显的方法来做到这一点。 命名空间是一个很棒的想法——让我们做更多的事情! $ python -c '导入这个' | grep的-o '\ <一个\>' 一个 一个 一个 $蟒蛇-c '导入此' | grep -o '\<one\>' | wc -l 3
tri*_*eee 14
不幸的是,这不适用于 GNU coreutils。
grep -o -c WORD file
Run Code Online (Sandbox Code Playgroud)
如果它适用于您的平台,那么它是一个优雅且相当直观的解决方案;但是GNU 的人们仍在思考。
sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " | tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl
Run Code Online (Sandbox Code Playgroud)
此命令执行以下操作:
例如,如果我想分析第一条 Linus Torvald 消息:
来自:torvalds@klaava.Helsinki.FI (Linus Benedict Torvalds) 新闻组:comp.os.minix 主题:您最希望在 minix 中看到什么?摘要:关于我的新操作系统的小型投票消息 ID:<1991Aug25.205708.9541@klaava.Helsinki.FI> 日期:25 Aug 91 20:57:08 GMT 组织:赫尔辛基大学
大家好,在那里使用 minix –
我正在为 386(486) AT 克隆做一个(免费)操作系统(只是一个爱好,不会像 gnu 那样大而专业)。这从四月就开始酝酿,并开始准备。我希望对人们在 minix 中喜欢/不喜欢的东西有任何反馈,因为我的操作系统与它有些相似(文件系统的物理布局相同(由于实际原因)等等)。
我目前已经移植了 bash(1.08) 和 gcc(1.40),一切似乎都有效。这意味着我会在几个月内得到一些实用的东西,我想知道大多数人想要什么功能。欢迎任何建议,但我不会保证我会实施它们
莱纳斯 (torvalds@kruuna.helsinki.fi)
附注。是的 - 它没有任何 minix 代码,而且它有一个多线程 fs。它不可移植(使用 386 任务切换等),并且它可能永远不会支持 AT 硬盘以外的任何东西,因为这就是我所拥有的 :-(。
我创建了一个名为linus.txt的文件,粘贴内容,然后在控制台中写入:
sed -e 's/[^[:alpha:]]/ /g' linus.txt | tr '\n' " " | tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl
Run Code Online (Sandbox Code Playgroud)
输出将是:
1 7 i
2 5 to
3 5 like
4 5 it
5 5 and
6 4 minix
7 4 a
8 3 torvalds
9 3 of
10 3 helsinki
11 3 fi
12 3 any
13 2 would
14 2 won
15 2 what
16 ...
Run Code Online (Sandbox Code Playgroud)
如果您只想可视化前 20 个单词:
sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " | tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl | head -n 20
Run Code Online (Sandbox Code Playgroud)
是要注意重要的命令TR“AZ”“A-Z”确实不能支持UTF-8还没有,所以在外语单词滑雪后会被翻译成阅。
如果你只想搜索一个词的出现,你可以在最后添加一个 grep :
sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " | tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl | grep "\sword_to_search_for$"
Run Code Online (Sandbox Code Playgroud)
在名为search_freq的脚本中:
#!/bin/bash
sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " | tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl | grep "\s$1$"
Run Code Online (Sandbox Code Playgroud)
必须调用脚本:
search_freq word_to_search_for
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
219704 次 |
| 最近记录: |