Даниил Подрабинек (grohman) wrote in ru_shell,
Даниил Подрабинек
grohman
ru_shell

Посчитать самые частые слова

Возникла задача посчитать слова в большом текстовом файле и сделать по ним топ-листинг. Сами слова разделены пробелами и знаками препинания - короче говоря, обычный текст.
Вывод топ-20 самых популярных русских и английских слов в файле words.txt длинной более 4 символов делается командой



cat words.txt| sed s/" "/"\n"/g|sort|sed 's/[[:upper:]]/\l&/g'|sed s/[^a-zа-я-]//g|uniq -c -d| sort -n| awk 'length($2) > 4'|tail -n 20| sort -n -r

Либо, если у вас проблемы между локалью и кодировкой символов, можно сделать вот так:
cat words.txt| sed s/" "/"\n"/g|sort| sed s/"[\,\?\!\.\"\'\:\;]"//g|uniq -c -d| sort -n| awk 'length($2) > 4'|tail -n 20| sort -n -r
В этом случае будут исключаться знаки препинания, а не все кроме букв и символа -

Конечно, можно вместо cat words.txt делать cat folder/*.txt
Tags: awk, bash, sed
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

  • 7 comments
Без awk и с немного другой метод обработки небуквенных символов:
sed 's/[^a-zA-Z]/\n/g' words.txt | sort | sed -n '/^.\{4\}/p' | uniq -cd | sort -nr | head -n 20
Ну фиг знает. В твоем примере печатаются слова от 4 символов длинной и только английские. Наверное нужно [^a-zA-Zа-яА-Я]
А еще я тут вспомнил, что некоторые буквы в словах могут быть в верхнем регистре, а могут в нем и не быть - добавил в свой однострочник sed 's/[[:upper:]]/\l&/g'
Хм.. Думаю, это проблема самого sed'а. "...Как видим Кириллица распознается как не изображаемые символы":

$ echo "englishЖужжалиБабочкиЖужжалиБабочки" | sed -n l

english\366\325\326\326\301\314\311\342\301\302\317\336\313\311\366\325\326\
\326\301\314\311\342\301\302\317\336\313\311$


Хотя не хочет и в виде кодов: sed 's/[^a-zA-Z\300-\377]/\n/g'
(восьмеричные диапазоны "а-яА-Я": \340-\377\300-\337)
[[:upper:]] тоже не срабатывает...

Но не смотря на все это, твой первый вариант корректно обрабатывает кириллицу, в отличии от моего ;-)) Что-то не понимаю пока, что я вижу ;-))
Ну на самом деле твой скрипт тоже корректно отработает кириллицу, если писать [^a-zA-Zа-яА-Я] . Это решается установкой $LC_ALL.
Спасибо за [^a-zA-Z], так гораздо правильнее избавляться от знаков препинания - подправил свой скрипт :)
>Это решается установкой $LC_ALL.
export LC_ALL="ru_RU.cp1251" ; sed 's/[^a-zA-Zа-яА-Я]/\n/g' nooem.txt |sort|sed -n '/^.\{4\}/p'|uniq -cd|sort -n
Однако, не решается!! Тоже об этом в первую очередь подумал...
LC_ALL="ru_RU.cp1251" ? Это у тебя так всегда? :)
Я так и знал, что это обратит внимание =))
На некоторых машинках ;-)) Впрос не в этом. Текстовый файл в той же кодировке, да и твоя строка на нем отлично срабатывает. Собака порылась в чем-то другом.