これ質問に回答しました特定のファイル名を検索してソートする方法について説明しましたが、ディレクトリ全体に対してこれを行うにはどうすればよいですか? 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
複数のファイルを検索する場合は、パターンに一致する各ファイルのファイル名が一致を含む行とともに表示されます。
実際には、すべてのテキストファイルをまとめて、次のようにして大きな文書として扱うことができます(コマンドラインで一度にすべてのファイルを処理することはできませんgrep
。cat
cat
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
*.txt
cat
-exec cat {} +
cat
find
cat
空の行を計算したくない場合は、パイプラインのsed '/^ *$/d'
最初の行の前または後に挿入することをお勧めします。sort