web-dev-qa-db-ja.com

ディレクトリのすべてのファイルでWordの出現を数える方法は?

ディレクトリ全体で特定のWordの出現をカウントしようとしています。これは可能ですか?

たとえば、100個のファイルがあるディレクトリがあり、すべてのファイルに「aaa」という単語が含まれているとします。そのディレクトリの下のすべてのファイルの「aaa」の数をどのように数えますか?

私は次のようなものを試しました:

 zegrep "xception" `find . -name '*auth*application*' | wc -l 

しかし、それは機能していません。

49
Ashish Sharma

grep -roh aaa . | wc -w

Grepは、現在のディレクトリ内のすべてのファイルとディレクトリを再帰的に検索して、aaaを検索し、行全体ではなく一致のみを出力します。次に、wcを使用して、そこにある単語の数をカウントします。

89

findおよびgrepに基づく別のソリューション。

find . -type f -exec grep -o aaa {} \; | wc -l

スペースを含むファイル名を正しく処理する必要があります。

7
Fredrik Pihl

AWKを使用しましょう!

$ 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

3
Sheharyar

grepを最も簡単な方法で使用します。 grep --help詳細については。


  1. 特定のファイルでWordのカウントを取得するには:

    grep -c <Word> <file_name>
    

    例:

    grep -c 'aaa' abc_report.csv
    

    出力:

    445
    

  1. ディレクトリ全体で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
1
Vijay

ファイルをまとめて、出力をgrepします:cat $(find /usr/share/doc/ -name '*.txt') | zegrep -ic '\<exception\>'

「例外」を一致させたい場合は、Wordの前後に「\ <」と「\>」を使用しないでください。

0
jcomeau_ictx

単語のみを一致させるための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 '\[\[:<:\]\]'
0
tim

次から始めてみてはどうですか:

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
0
paxdiablo