LINUX.ORG.RU

[grep] [кириллица] количество вхождений слова

 ,


0

0

Итак, возникла необходимость посчитать количество вхождений некоторых слов в большом файле. Подумалось мне, что grep отлично подойдет. Что ж, пробуем.

grep -wi as log.txt
As I think...
as new as
>as long as
Вполне прилично находит отдельные слова. Попробуем с кириллицей.
grep -wi ну log.txt
ну-ка тихо
сейчас скину
а я пока гляну
Совсем не то. Grep в этом плане несовместим с кириллицей или что с ним?

GNU Grep 2.6.3

man grep:

Word-constituent characters are letters, digits, and the underscore.

По всей видимости, кириллица - это не letters

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Довольно печально. Вроде и работает с кириллицей прекрасно, да за буквы не считает.
Какие ещё есть пути решения проблемы?

mingebag
() автор топика

Запускай grep с той локалью, которая у тебя в проверяемом тексте - всё будет правильно грепать. А если даже так не работает - выкинь свою слаку-каку и пользуйся нормальным дистрибутивом.

P.S. Не совсем понятно, как ты таким способом собираешся посчитать количество вхождений слова - ты получишь только количество строк с этим словом.

Led ★★★☆☆
()
Ответ на: комментарий от Led

> P.S. Не совсем понятно, как ты таким способом собираешся посчитать количество вхождений слова - ты получишь только количество строк с этим словом.

echo ну-ка тихо сейчас скину а я пока гляну|sed 's/ну/ну\n/g'|grep ну|wc -l

pupok ★★
()
Ответ на: комментарий от pupok

>echo ну-ка тихо сейчас скину а я пока гляну|sed 's/ну/ну\n/g'|grep ну|wc -l

Не, не прокатит:)

Подсказка: нужно посчитать СЛОВА, а не буквосочетания

Led ★★★☆☆
()
Ответ на: комментарий от Led

ну идея-то понятна

echo ну ну-ка тихо сейчас скину а я пока гляну.ну я запарился|sed 's/^ну/\ ну/g'|sed 's/\.ну/\ ну/g'|sed 's/\,ну/\ ну/g'|sed 's/\ ну\ /\ ну\ \n/g'|grep " ну «|wc -l

ну и дальше накручивать по мере того как „определение что такое СЛОВО“ будет уточняться.

pupok ★★
()

Зачем заморачиваться с grep, когда есть готовая программа подсчета количества вхождений слов на awk?

{
  $0 = tolower($0)    # remove case distinctions
  # remove punctuation
  gsub(/[^[:alnum:]_[:blank:]]/, "", $0)
  for (i = 1; i <= NF; i++)
    freq[$i]++
}

END {
  for (word in freq)
  printf "%s\t%d\n", word, freq[word]
}
Сохранить этот текст под именем wordfreq.awk и запускать так:
awk -f wordfreq.awk log.txt
Эта программа приведена в info gawk.

gorky ★★
()
Ответ на: комментарий от Led

sed -r 's/[^[:alnum:]_]+/\n/g' | grep -cwio '^СЛОВО$'

И не надо ничего «накручивать», и даже wc не нужен:)

Led ★★★☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.