Ответ 1
grep -roh aaa . | wc -w
Рекурсивно переместите все файлы и каталоги в текущем каталоге поиска aaa и выведите только совпадения, а не всю строку. Затем просто используйте wc
для подсчета количества слов.
Im пытается подсчитать конкретное слово в целом каталоге. Возможно ли это?
Скажем, например, есть каталог с 100 файлами, все файлы которых могут содержать в них слово "aaa". Как я могу подсчитать количество "aaa" во всех файлах в этом каталоге?
Я пробовал что-то вроде:
zegrep "xception" `find . -name '*auth*application*' | wc -l
Но он не работает.
grep -roh aaa . | wc -w
Рекурсивно переместите все файлы и каталоги в текущем каталоге поиска 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
Здесь перечисляется частота каждого слова, входящего в предоставленный файл. Если вы хотите увидеть вхождения вашего слова, вы можете просто сделать это:
$ cat your_file.txt | wordfrequency | grep yourword
Чтобы найти вхождения вашего слова во все файлы в каталоге (нерекурсивно), вы можете сделать это:
$ cat * | wordfrequency | grep yourword
Чтобы найти вхождения вашего слова во все файлы в каталоге (и его подкаталогах), вы можете сделать это:
$ find . -type f | xargs cat | wordfrequency | grep yourword
Источник: AWK-ward Ruby
find .|xargs perl -p -e 's/ /\n'|xargs grep aaa|wc -l
Используйте 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
скомпоновать файлы и 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
подсчитывает эти строки для вас.
Теперь могут быть случаи кросс, где этот script не работает, но в подавляющем большинстве случаев он должен быть в порядке.
Если вам нужно целое дерево (а не только один уровень каталога), вы можете использовать somthing как:
( 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
Для другого синтаксиса regex, сопоставляющего слова, см.:
man re_format | less -p '\[\[:<:\]\]'