Как подсчитать вхождения слова во все файлы каталога?
Я пытаюсь подсчитать конкретное слово, встречающееся в целой директории. Возможно ли это?
Предположим, например, что существует каталог со 100 файлами, в каждом из которых может содержаться слово "aaa". Как бы я посчитал количество "aaa" во всех файлах в этом каталоге?
Я попробовал что-то вроде:
zegrep "xception" `find . -name '*auth*application*' | wc -l
Но это не работает.
8 ответов:
grep -roh aaa . | wc -wGrep рекурсивно все файлы и каталоги в текущем dir ищет aaa, и выводит только совпадения, а не всю строку. Затем просто используйте
wcдля подсчета количества слов.
Другое решение, основанное на
findиgrep.find . -type f -exec grep -o aaa {} \; | wc -lДолжен корректно обрабатывать имена файлов с пробелами в них.
Давайте использовать 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-ward Ruby
Используйте
grepсамым простым способом. Попробуйтеgrep --helpдля получения дополнительной информации.
Чтобы получить количество слов в конкретном файле :
grep -c <word> <file_name>Пример:
grep -c 'aaa' abc_report.csvВывод:
445
Чтобы получить количество слов в весь каталог :
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
Cat файлы вместе и grep вывод:
cat $(find /usr/share/doc/ -name '*.txt') | zegrep -ic '\<exception\>'Если вы хотите, чтобы "исключительный" соответствовал, не используйте "\ " вокруг слова.
Как насчет того, чтобы начать с:
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
Существует также синтаксис регулярных выражений grep для сопоставления только слов:
# based on Carlos Campderrós solution posted in this thread man grep | less -p '\<' grep -roh '\<aaa\>' . | wc -lДля другого синтаксиса регулярных выражений соответствия слов см.:
man re_format | less -p '\[\[:<:\]\]'
Comments