Здравствуйте!
Помогите пожалуйста написать shell-процедуру под UNIX.
Задание:
Написать shell-процедуру, которая:
• В заданном первым параметром файле находит все слова-омонимы;
• Выводит на экран строки, содержащие омонимы;
• Подсчитывает в каждой строке число символов, совпадающих с заданным вторым параметром символом, и выводит его на экран
Желательно прокомментировать.
Омонимы - слова, которые пишутся одинаково, но имеют разный смысл. Здесь, видимо, имеются в виду одинаковые слова.
Когда я спрашивал, препод вообще ничего не мог сказать по поводу, что тут подразумевалось под омонимом; судя по всему, он и слова-то такого - "омоним" не знает...
Так что пусть будет означать, что ищем в тексте одинаковые слова. Если они есть - то с ними и работаем дальше.
За вознаграждение. Сами прикиньте, сколько это будет стоить. Мне кажется, для знающего человека задание не шибко сложное... Я полагаю не больше 100, максимум 150 рублей...
А можете привести пример текста в котором нужно найти слова?
при чем тут структура текста?
человеку нужно найти все повторяющиеся слова.
я вижу это следующим образом:
последовательное сканирование каждого слова в тексте с одновременным поиском этого каждого слова на предмет повтора.
я тоже примерно знаю как это реализовать.
1.разбить текст на слова
2.убрать знаки припинания через sed
3.отсортировать
4.найти одинаковые слова
5.через grep найти строки
последний пункт еще думаю(подсчет символов), но примерно знаю как реализовать. не ради денег, но ради тренировки. скоро могу предоставить код.
я тоже примерно знаю как это реализовать.
1.разбить текст на слова
2.убрать знаки припинания через sed
3.отсортировать
4.найти одинаковые слова
5.через grep найти строки
последний пункт еще думаю(подсчет символов), но примерно знаю как реализовать. не ради денег, но ради тренировки. скоро могу предоставить код.
1. заменить все знаки препинания на символ новой строки.
2. уже решено
3. отсортировать
4. каким образом? тоже через грип с комбинацией | wc -l ?
5.через grep найти строки
ну дык, греп по мойму умеет отображать номера строк найденого рега.
я вижу это следующим образом:
последовательное сканирование каждого слова в тексте с одновременным поиском этого каждого слова на предмет повтора.
садись, два.
Note: сложность вашего решения пропорциональна O(N*N)
Hint: можно составить список слов, а потом его отсортировать (man sort), затем отфильтровать повторы (man uniq). Если при этом не забыть прицепить к каждому слову номер строки в исходном тексте, то мы сможем распечатать эти строки. Сложность O(N*log(N))
"i2ks" написал:
Похоже на д.кр, или л/р, 100р ИМХО мало, 500 и выше
можно и 350руб наверное. Таки пост майский, наверное не актуально.
"wlad.bologov" написал:
я тоже примерно знаю как это реализовать.
1.разбить текст на слова
2.убрать знаки припинания через sed
3.отсортировать
4.найти одинаковые слова
5.через grep найти строки
на правах быдлокодера,
еще пилить и пилить.
опять же со знаками, в ядре 2.6 убрался знак "." и получилось одно слово 26. но совпадений по нему нет.
разделить табуляцией чтоб привести в красивый вид.
формат
число_слов слово строки в которых найдено
> cat slovo.test
In everyone's life a little rain must fall. My main Linux workstation at home suffered a hard drive failure the day after Christmas. I can only guess I was bad last year and Santa turned my hard drive into a lump of coal as punishment.
Unfortunately, at some point over the year I introduced a typo in a script I used to backup my personal website and some other data on that particular computer. Along with some data that wasn't very important, I lost my handy little script I used to setup iptables to NAT my internal network to the Internet at large.
After an hour of not being able to find a quick and easy tutorial on how to do this seemingly basic task on Google, I promised myself I would write this Quick-Tip.
If you are running a recent 2.6 Linux Kernel this four step process should work for you. This has been specifically tested on Fedora Core 3, 4, 5, and 6, but should work on any modern Linux distribution. All of these commands must be executed as the root user. First you need to tell your kernel that you want to allow IP forwarding.()
text
> cat script
#!/bin/bash
cat slovo.test | tr ' ' '\n' | sed 's/[\., ]//' | sed 's/[)]//' | sed 's/(//' | sort | grep "." > omonimys_temp
lupo@gentoo-laptop /tmp % ./slova.sh kismet.txt 3 | wgetpaste
Your paste can be seen here: http://bpaste.net/show/40571/
lupo@gentoo-laptop /tmp % ./slova.sh kismet.txt 5 | wgetpaste
Your paste can be seen here: http://bpaste.net/show/40572/