Как посчитать вхождения слова во все файлы каталога? - PullRequest
49 голосов
/ 26 мая 2011

Я пытаюсь сосчитать конкретное вхождение слова во всем каталоге. Возможно ли это?

Скажем, например, есть каталог с 100 файлами, в файлах которых может быть слово «aaa». Как бы я посчитал количество «aaa» во всех файлах в этом каталоге?

Я пробовал что-то вроде:

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

Но это не работает.

Ответы [ 8 ]

88 голосов
/ 26 мая 2011

grep -roh aaa . | wc -w

Grep рекурсивно все файлы и каталоги в текущем каталоге ищет aaa, и выводит только совпадения, а не всю строку.Затем просто используйте wc, чтобы подсчитать, сколько слов там.

7 голосов
/ 28 мая 2011

Другое решение, основанное на find и grep.

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

Должно правильно обрабатывать имена файлов с пробелами в них.

3 голосов
/ 16 декабря 2014

Давайте использовать 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

Здесь указана частота каждого слова, встречающегося в предоставленном файле. Если вы хотите увидеть вхождения вашего слова, вы можете просто сделать это:

$ cat your_file.txt | wordfrequency | grep yourword

Чтобы найти вхождения вашего слова во всех файлах в каталоге (не рекурсивно), вы можете сделать это:

$ cat * | wordfrequency | grep yourword

Чтобы найти вхождения вашего слова во всех файлах в каталоге (и его подкаталогах), вы можете сделать это:

$ find . -type f | xargs cat | wordfrequency | grep yourword

Источник: AWK-защита Рубина

2 голосов
/ 13 марта 2016

Используйте grep самым простым способом. Попробуйте grep --help для получения дополнительной информации.


  1. Для подсчета слова в конкретном файле :

    grep -c <word> <file_name>
    

    Пример:

    grep -c 'aaa' abc_report.csv
    

    Выход:

    445
    

  1. Чтобы получить количество слов во всем каталоге :

    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
    
1 голос
/ 26 мая 2011
find .|xargs perl -p -e 's/ /\n'|xargs grep aaa|wc -l
0 голосов
/ 28 мая 2011

Существует также синтаксис grep regex только для соответствующих слов:

# based on Carlos Campderrós solution posted in this thread
man grep | less -p '\<'
grep -roh '\<aaa\>' . | wc -l

Информацию о другом синтаксисе регулярных выражений для сопоставления слов см. В

man re_format | less -p '\[\[:<:\]\]'
0 голосов
/ 26 мая 2011

Как насчет начать с:

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 преобразует пробелы в символы новой строки (вы можете включить другие пробелы, а также символы табуляции, с sed 's/[ \t]/\n/g'). grep просто получает те строки, которые имеют нужное слово, тогда wc подсчитывает эти строки для вас.

Теперь могут быть крайние случаи, когда этот сценарий не работает, но он должен подойти для подавляющего большинства ситуаций.

Если вам нужно целое дерево (а не только один уровень каталога), вы можете использовать что-то вроде:

( find . -name '*.txt' -exec cat {} ';' ) | sed 's/ /\n/g' | grep '^aaa$' | wc -l
0 голосов
/ 26 мая 2011

объедините файлы и сгенерируйте вывод: cat $(find /usr/share/doc/ -name '*.txt') | zegrep -ic '\<exception\>'

, если вы хотите, чтобы «исключительный» совпадал, не используйте «\ <» и «\>» вокруг слова.

...