Даниил Подрабинек (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
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 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" ? Это у тебя так всегда? :)
Я так и знал, что это обратит внимание =))
На некоторых машинках ;-)) Впрос не в этом. Текстовый файл в той же кодировке, да и твоя строка на нем отлично срабатывает. Собака порылась в чем-то другом.