1行にある大きなJSONファイルがあり、コマンドラインを使用して、ファイル内のWordの出現回数をカウントできるようにしたいと考えています。どうやってやるの?
$ 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\>'
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
残念ながら、これはGNU coreutils
では機能しません。
grep -o -c Word file
ご使用のプラットフォームで動作する場合、エレガントでかなり直感的なソリューションです。しかし 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
このコマンドは次のようになります。
たとえば、最初の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
キーと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'
(完全なキーまたは値に一致させるため)または類似の方法でカウントを行います。
私はこのようなものでjsonを持っています:"number":"OK","number":OK"
1行で複数回繰り返されました。
私のシンプルな「OK」カウンター:
sed "s|,|\n|g" response | grep -c OK
grep -c
を使用すると、行だけがカウントされます。1つの行でWordが多数出現する可能性があります。
これはそれを行います:
grep -o Word foo|wc -l