1行だけの大きなJSONファイルがあり、コマンドラインを使用してファイル内の特定の単語の発生回数を計算したいと思います。どうすればいいですか?
答え1
$ tr ' ' '\n' < FILE | grep WORD | wc -l
ここでは、tr
スペースを改行に置き換え、grep
WORDに一致するすべての結果行をフィルタリングし、wc
残りの行を計算します。
wc
grepオプションを使用してセクションを保存することもできます-c
。
$ tr ' ' '\n' < FILE | grep -c WORD
この-c
オプションは POSIX によって定義されます。
単語間のスペースが保証されない場合は、代わりに別の文字(区切り文字)を使用する必要があります。たとえば、交換tr
部品は次のとおりです。
tr '"' '\n'
または
tr "'" '\n'
二重引用符または一重引用符を変更する場合。もちろんtr
、一度に複数の文字を置き換えることもできます(さまざまな種類のスペースや句読点を考えてみてください)。
WORDを計算する必要がありますが、prefixWORD、WORDsuffix、またはprefixWORDsuffixを計算しない場合は、行の開始/終了タグにWORDパターンを囲むことができます。
grep -c '^WORD$'
私たちの文脈では、これは単語の開始/終了タグと同じです。
grep -c '\<WORD\>'
答え2
GNU grepを使用すると、次のような効果が得られます。grep -o '\<WORD\>' | wc -l
-o
各行の一致する部分を別々の行に印刷します。
\<
単語の先頭を確認して\>
単語の終わりを確認するので(Perlのように\b
)、単語の途中で文字列が一致しないようにします。
例えば、
$python -c 'インポート' | grep '\<a\>' 持っていなければならない一つ- そして好ましくは一つ- 明らかな方法ですね。 名前空間は一つ良いアイデアです。もっと作りましょう! $python -c 'インポート' | grep -o '\<a\>' 一つ 一つ 一つ $python -c 'これを取得してください' | grep -o '\<a\>' | サム
答え3
残念動作しませんGNUでcoreutils
。
grep -o -c WORD file
あなたのプラットフォームで動作する場合は、エレガントでかなり直感的なソリューションです。GNUの人々はまだ考えています。
答え4
JSONデータのキーまたは値の単語を一致させるかどうかに応じて、データからキーまたは値のみを抽出したい場合があります。そうでないと、一部の単語がキーと値の両方で表示されていると、計算が多すぎる可能性があります。
すべてのキーを抽出するには:
jq -r '..|objects|keys[]' <file.json
これは現在のものがオブジェクトかどうかを再帰的にテストし、オブジェクトの場合はキーを抽出します。出力は1行に1つずつキーのリストになります。
すべての値を抽出するには:
jq -r '..|scalars' <file.json
これは同様の方法で動作しますが、ステップが少なくなります。
次に、上記の内容を出力にパイプするかgrep -c 'PATTERN'
(一部のパターンをキーまたは値と一致させるため)、またはgrep -c -w -F 'WORD'
(一致するため)言葉キーまたは値から)またはgrep -c -x -F 'WORD'
(フルキーまたは値と一致)または同様の操作を実行して計算を実行します。