シェルである文章内からある単語の登場回数を調べる

2020-01-20Bash, Linux

はじめに

文章内から特定の単語の登場回数を調べる方法について紹介します。

検証環境

$ uname -moi
x86_64 x86_64 GNU/Linux

$ bash -version | head -n 1
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)

サンプル文章の用意

サンプル文章を用意します。

Wikipedia の「ONE_PIECE」のページをサンプルとして利用したいと思います。

$ curl -s https://ja.wikipedia.org/wiki/ONE_PIECE > one_piece.html

HTMLのタグが混ざり込んでいますが、特定の検索キーワードを探す分には問題ないでしょう。

grep を使って「特定の単語」の登場回数を調べる方法

はじめに断っておくと、 grep -c を使う方法はおすすめしません。

grep -c で検索対象の単語の登場回数を調べることができます。

$ grep -c ワンピース one_piece.html
138

ただし、注意が必要です。 grep -c の検索結果数は、 「単語の登場回数」 ではなく 「単語が1文字以上見つかった行数」 になっています。

# 3行の中に "ワンピース" の文字が6回登場している
$ grep ワンピース one_piece.html | head -n 3
<td>この項目では、尾田栄一郎の漫画について説明しています。アニメ版については「<a href="/wiki/ONE_PIECE_(%E3%82%A2%E3%83%8B%E3%83%A1)" title="ONE PIECE (アニメ)">ONE PIECE (アニメ)</a>」を、その他の「ワンピース」については「<a href="/wiki/%E3%83%AF%E3%83%B3%E3%83%94%E3%83%BC%E3%82%B9_(%E6%9B%96%E6%98%A7%E3%81%95%E5%9B%9E%E9%81%BF)" class="mw-disambig" title="ワンピース (曖昧さ回避)">ワンピース (曖昧さ回避)</a>」をご覧ください。
<p>『<b>ONE PIECE</b>』(ワンピース)は、<a href="/wiki/%E5%B0%BE%E7%94%B0%E6%A0%84%E4%B8%80%E9%83%8E" title="尾田栄一郎">尾田栄一郎</a>による<a href="/wiki/%E6%97%A5%E6%9C%AC" title="日本">日本</a>の<a href="/wiki/%E5%B0%91%E5%B9%B4%E6%BC%AB%E7%94%BB" title="少年漫画">少年漫画</a>作品。『<a href="/wiki/%E9%80%B1%E5%88%8A%E5%B0%91%E5%B9%B4%E3%82%B8%E3%83%A3%E3%83%B3%E3%83%97" title="週刊少年ジャンプ"> 週刊少年ジャンプ</a>』(<a href="/wiki/%E9%9B%86%E8%8B%B1%E7%A4%BE" title="集英社">集英社</a>)にて<a href="/wiki/1997%E5%B9%B4" title="1997年">1997年</a>34号より連載中。略称は「<b>ワンピ</b>」。
<li class="toclevel-2 tocsection-60"><a href="#ワンピース・プレミア・サマー"><span class="tocnumber">12.2</span> <span class="toctext">ワンピース・プレミア・サマー</span></a></li>

# この結果を `grep -c` で検索すると、 6ではなく3という結果が帰ってくる
$ grep ワンピース one_piece.html | head -n 3 | grep -c ワンピース
3

grep -o ... | wc -l を使う方法

行数ではなく単語の登場回数を知りたい場合には、 grep -o の結果を wc -l にパイプで繋いでやるほうが良いでしょう。

$ grep -o ワンピース one_piece.html | wc -l
173

"ワンピース" の単語は 173回 登場していることがわかります。

2020-01-18現在、該当ページのHTMLソースをChromeで開き、検索すると同様の結果となっていることがわかります。

  • view-source:https://ja.wikipedia.org/wiki/ONE_PIECE

ひとこと

grep -o . ですべての文字を行に分割したりできますし、 grep -o は重宝します。

2020-01-20Bash, Linux