ディレクトリ全体で特定のWordの出現をカウントしようとしています。これは可能ですか?
たとえば、100個のファイルがあるディレクトリがあり、すべてのファイルに「aaa」という単語が含まれているとします。そのディレクトリの下のすべてのファイルの「aaa」の数をどのように数えますか?
私は次のようなものを試しました:
zegrep "xception" `find . -name '*auth*application*' | wc -l
しかし、それは機能していません。
grep -roh aaa . | wc -w
Grepは、現在のディレクトリ内のすべてのファイルとディレクトリを再帰的に検索して、aaaを検索し、行全体ではなく一致のみを出力します。次に、wc
を使用して、そこにある単語の数をカウントします。
find
およびgrep
に基づく別のソリューション。
find . -type f -exec grep -o aaa {} \; | wc -l
スペースを含むファイル名を正しく処理する必要があります。
$ function wordfrequency() { awk 'BEGIN { FS="[^a-zA-Z]+" } { for (i=1; i<=NF; i++) { Word = tolower($i); words[Word]++ } } END { for (w in words) printf("%3d %s\n", words[w], w) } ' | sort -rn; }
$ cat your_file.txt | wordfrequency
これは、提供されたファイルで発生する各Wordの頻度をリストします。Wordの発生を確認したい場合は、これを行うことができます:
$ cat your_file.txt | wordfrequency | grep yourword
ディレクトリ内のすべてのファイルで(非再帰的に)Wordの出現を見つけるには、これを行うことができます:
$ cat * | wordfrequency | grep yourword
ディレクトリ(およびそのサブディレクトリ)内のすべてのファイルでWordの出現を見つけるには、次のようにします:
$ find . -type f | xargs cat | wordfrequency | grep yourword
ソース: AWK-ward Ruby
grep
を最も簡単な方法で使用します。 grep --help
詳細については。
特定のファイルでWordのカウントを取得するには:
grep -c <Word> <file_name>
例:
grep -c 'aaa' abc_report.csv
出力:
445
ディレクトリ全体でWordのカウントを取得するには:
grep -c -R <Word>
例:
grep -c -R 'aaa'
出力:
abc_report.csv:445
lmn_report.csv:129
pqr_report.csv:445
my_folder/xyz_report.csv:408
find .|xargs Perl -p -e 's/ /\n'|xargs grep aaa|wc -l
ファイルをまとめて、出力をgrepします:cat $(find /usr/share/doc/ -name '*.txt') | zegrep -ic '\<exception\>'
「例外」を一致させたい場合は、Wordの前後に「\ <」と「\>」を使用しないでください。
単語のみを一致させるためのgrep正規表現構文もあります。
# based on Carlos Campderrós solution posted in this thread
man grep | less -p '\<'
grep -roh '\<aaa\>' . | wc -l
正規表現構文に一致する別のWordについては、以下を参照してください。
man re_format | less -p '\[\[:<:\]\]'
次から始めてみてはどうですか:
cat * | sed 's/ /\n/g' | grep '^aaa$' | wc -l
次の写しのように:
pax$ cat file1
this is a file number 1
pax$ cat file2
And this file is file number 2,
a slightly larger file
pax$ cat file[12] | sed 's/ /\n/g' | grep 'file$' | wc -l
4
sed
はスペースを改行に変換します(タブなどのotherスペース文字を含めることもできますが、sed 's/[ \t]/\n/g'
)。 grep
は、目的のWordを持つ行を取得するだけで、wc
はそれらの行をカウントします。
現在、このスクリプトが機能しないEdgeケースが存在する場合がありますが、ほとんどの状況で問題ありません。
tree(単一のディレクトリレベルだけでなく)全体が必要な場合は、次のようなものを使用できます。
( find . -name '*.txt' -exec cat {} ';' ) | sed 's/ /\n/g' | grep '^aaa$' | wc -l