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

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)

  • 这个答案在很多方面都是不正确的。它很模糊:你应该解释如何想出一个完成这项工作的“tr”命令,而不是建议在所有情况下都不起作用的示例。它还将匹配包含您要查找的单词的单词。`grep -o '\&lt;WORD\&gt;' | wc -l` 解决方案要优越得多。 (2认同)

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

  • 或者只是`grep -wo WORD | wc -l` (3认同)

tri*_*eee 14

不幸的是,不适用于 GNU coreutils

grep -o -c WORD file
Run Code Online (Sandbox Code Playgroud)

如果它适用于您的平台,那么它是一个优雅且相当直观的解决方案;但是GNU 的人们仍在思考。

  • 我的不好,错误仍然存​​在:http://savannah.gnu.org/bugs/?33080 (2认同)

Rog*_*ell 9

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)

此命令执行以下操作:

  1. 用空格替换所有非字母数字字符。
  2. 所有换行符也转换为空格。
  3. 将所有多个空格减少为一个空格
  4. 所有空格现在都转换为换行符。一行中的每个字。
  5. 将所有单词翻译成小写,以避免“Hello”和“hello”成为不同的单词
  6. 文本排序
  7. 计数并删除相等的线
  8. 反向排序以计算最常用的单词
  9. 为每个单词添加一个行号,以了解整个单词的位置

例如,如果我想分析第一条 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)