web-dev-qa-db-ja.com

コマンドラインでテキストファイル内のWordの出現回数を数えるにはどうすればよいですか?

1行にある大きなJSONファイルがあり、コマンドラインを使用して、ファイル内のWordの出現回数をカウントできるようにしたいと考えています。どうやってやるの?

45
mythz
$ tr ' ' '\n' < FILE | grep Word | wc -l

trはスペースを改行で置き換え、grepはWordに一致するすべての結果の行をフィルタリングし、wcは残りの行をカウントします。

Grepの-cオプションを使用してwcパーツを保存することもできます。

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

-cオプションはPOSIXで定義されています。

単語間にスペースがあることが保証されていない場合は、置換するために(区切り文字として)他の文字を使用する必要があります。たとえば、代替のtrパーツは

tr '"' '\n'

または

tr "'" '\n'

二重引用符または単一引用符を置き換える場合。もちろん、trを使用して複数の文字を一度に置き換えることもできます(さまざまな種類の空白や句読点を考えてください)。

Wordをカウントする必要があるが、prefixWORD、WORDsuffix、prefixWORDsuffixはカウントしない場合は、Wordパターンを行頭/行末マーカーで囲むことができます。

grep -c '^Word$'

これは、私たちのコンテキストでは、Word-begin/endマーカーに相当します。

grep -c '\<Word\>'
48
maxschlepzig

GNU grepの場合、これは機能します:grep -o '\<Word\>' | wc -l

-oは、各行の一致する各部分を別々の行に出力します。

\<は単語の始まりをアサートし、\>は単語の終わりをアサートします(Perlの\bと同様)。これにより、語。

例えば、

ドル python -c 'これをインポート' | grep '\ <one \>' 
 1-できれば、 1 -それを行うための明白な方法。
名前空間は 1 素晴らしいアイデアを警戒します-それらをもっとやってみましょう!
ドル python -c 'これをインポートする' | grep -o '\ <one \>' 
111ドル python -c 'これをインポートする' | grep -o '\ <one \>' | wc -l 
 3 
25
ephemient

残念ながら、これはGNU coreutilsでは機能しません

grep -o -c Word file

ご使用のプラットフォームで動作する場合、エレガントでかなり直感的なソリューションです。しかし GNU人々はまだ考えています。

11
tripleee
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 

このコマンドは次のようになります。

  1. 英数字以外のすべての文字を空白に置き換えます。
  2. すべての改行もスペースに変換されます。
  3. 複数の空白をすべて1つの空白に減らす
  4. すべてのスペースが改行に変換されるようになりました。行の各単語。
  5. 「Hello」と「hello」が異なる単語になるのを防ぐために、すべての単語を小文字に変換します
  6. テキストをソートします
  7. 等しい行をカウントして削除します
  8. 最も頻度の高い単語をカウントするために逆順にソートします
  9. 単語の全体を理解するために、各単語に行番号を追加します

たとえば、最初のLinus Torvaldメッセージを分析したい場合:

差出人:[email protected](Linus Benedict Torvalds)ニュースグループ:comp.os.minix件名:minixで何を最も見たいですか?概要:新しいオペレーティングシステムの小規模な投票Message-ID:<[email protected]>日付:91 Aug 25 20:57:08 GMT組織:ヘルシンキ大学

みなさん、こんにちは。

私は386(486)AT=クローン)の(無料の)オペレーティングシステム(単なる趣味であり、gnuのように大きく専門的ではありません)を実行しています。これは4月から作成されています。私のOSは多少似ています(とりわけ、(実際的な理由により)ファイルシステムの物理レイアウトが同じ)ので、人々がminixで好き/嫌いなことについてのフィードバックをお願いします。

私は現在bash(1.08)とgcc(1.40)を移植しましたが、うまくいくようです。これは、数か月以内に実用的なものが得られることを意味し、ほとんどの人が望む機能を知りたいのです。どんな提案も歓迎しますが、私はそれらを実装することを約束しません????

Linus([email protected]

PS。はい。minixコードは一切含まれておらず、マルチスレッドfsを備えています。それはprotableではありません(386のタスク切り替えなどを使用します)。AT-harddisk以外のものはおそらくサポートされません。

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 

出力は次のようになります。

 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        ...

最初の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

コマンドtr 'AZ' 'a-z'はUTF-8 まだ をサポートしていないため、外国語ではAPRÈSという単語はaprÈsとして翻訳されます。

1つの単語の出現を検索するだけの場合は、末尾に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$"

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$"

スクリプトを呼び出す必要があります。

 search_freq Word_to_search_for
7
Roger Borrell

キーとJSONデータの値のどちらでWordを照合するかに応じて、データからキーのみまたは値のみを抽出することがよくあります。そうしないと、いくつかの単語がキーと値の両方として出現する場合、それらの単語を何度も数える可能性があります。

すべてのキーを抽出するには:

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

これは、現在のものがオブジェクトであるかどうかを再帰的にテストし、オブジェクトである場合はキーを抽出します。出力は、1行に1つずつ、キーのリストになります。

すべての値を抽出するには:

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

これは同じように機能しますが、手順は少なくなります。

次に、上記の出力をgrep -c 'PATTERN'(キーまたは値に対して何らかのパターンを照合するため)、またはgrep -c -w -F 'Word'(キーまたは値のWordと一致させるため)、またはgrep -c -x -F 'Word'(完全なキーまたは値に一致させるため)または類似の方法でカウントを行います。

3
Kusalananda

私はこのようなものでjsonを持っています:"number":"OK","number":OK" 1行で複数回繰り返されました。

私のシンプルな「OK」カウンター:

sed "s|,|\n|g" response | grep -c OK

0

grep -cを使用すると、行だけがカウントされます。1つの行でWordが多数出現する可能性があります。

これはそれを行います:

grep -o Word foo|wc -l
0