単一のコマンドラインコマンドを使用して、データベース内の各テキストファイルで最も一般的な10の単語をどのように検索できますか?

単一のコマンドラインコマンドを使用して、データベース内の各テキストファイルで最も一般的な10の単語をどのように検索できますか?

これ質問に回答しました特定のファイル名を検索してソートする方法について説明しましたが、ディレクトリ全体に対してこれを行うにはどうすればよいですか? 100万のテキストファイルがあり、最も一般的な10の単語を検索する必要があります。

データベース = /data/000/0000000/s##_date/*.txt - /data/999/0999999/s##_data/*txt

私が試したすべての結果は、ファイル名、パス、またはディレクトリソートエラーにつながりました。

grepを使って少し進歩しましたが、ファイル名の一部が結果に表示されるようです。

grep -r . * | tr -c '[:alnum:]' '[\n*]' | sort | uniq -c | sort -nr | head  -10
output:
 1145 
    253 txt
    190 s01
    132 is
    126 of
    116 the
    108 and
    104 test
     92 with
     84 in

「txt」と「s01」は、テキストファイル内のテキストではなく、ファイル名から来ます。 「the」のような一般的な単語を除外する方法があることを知っていますが、ファイル名を並べ替えて計算したくありません。

答え1

grep複数のファイルを検索する場合は、パターンに一致する各ファイルのファイル名が一致を含む行とともに表示されます。

実際には、すべてのテキストファイルをまとめて、次のようにして大きな文書として扱うことができます(コマンドラインで一度にすべてのファイルを処理することはできませんgrepcatcat

find /data -type f -name '*.txt' -exec cat {} + |
tr -cs '[:alnum:]' '\n' | sort | uniq -c | sort -nr | head

複数の連続した改行文字が1つに圧縮され、英数字以外のすべての項目が改行文字に変更されるように追加しました(-s私にとってはほとんど理解されていません)。このコマンドはデフォルトで10行の出力を生成するため、(or)は必要ありません。tr[\n*]head-10-n 10

このコマンドは、findファイル名がこのパターンと一致する-type fすべての一般ファイル()を検索します。一度にできるだけ多くのファイルを呼び出して接続します(これが完了しました)。ファイルの数が多い場合は複数回呼び出すことができますが、+から出力ストリームを読み取るだけで、パイプラインの残りの部分には影響しません。/data*.txtcat-exec cat {} +catfindcat


空の行を計算したくない場合は、パイプラインのsed '/^ *$/d'最初の行の前または後に挿入することをお勧めします。sort

関連情報