Погода: −7 °C
24.11−7...−3пасмурно, небольшой снег
25.11−8...−3переменная облачность, без осадков
  • Если есть люди сведующие в шелле, то подскажите идеологически как реализовать скрипт, кторому надо будет подсовывать текстовый файл, а он выдавать количество вхождений по каждому из слов которое есть в этом файле.
    Можно использовать стандартные утилитки (какие ?).

    Заранее спасибо.

    "Цени олдскул Вася, и не ведись на моду" © - Нагано.

  • В смысле разбить текст на уникальные слова и посчитать их?

  • Именно. Брать от пробела до пробела (или символа табуляции, перевода каретки (/n)), смотреть есть в массиве такое слово, если есть увлечить счетчик этого слова на 1, иначе внести слово. Мелочи типа что после слова может следовать запятая не особо важны.
    На Си я хорошо представляю себе как это реализовать, а вот на шелле ?????

    "Цени олдскул Вася, и не ведись на моду" © - Нагано.

  • берешь perl и пишешь прогу с использованием регулярных выражений...
    :улыб:

    Все что написано мною - IMHO!

  • Можно использовать стандартные утилитки (какие ?).
    RTFM grep

    who | grep -i blonde | date; cd ~; unzip; touch;
    strip; finger; mount; gasp; yes; uptime; umount;

  • Откусывать по одному слову и складывать в hash-массив....

    Когда проснулся, тогда и "Доброе утро!"

  • Прочитал ман по грепу. Сейчас пытаюсь сделать используя man и sed.

    "Цени олдскул Вася, и не ведись на моду" © - Нагано.

  • Ничего не получается (
    Буду рад конкретным примерам.

    "Цени олдскул Вася, и не ведись на моду" © - Нагано.

  • например, так:
    _______________________________________

    #!/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. тестировался скрипт совсем слабо, можно сказать, совсем не тестировался

  • Огромное спасибо за помощь. :улыб:
    В ответ на: (ifconfig; cat /etc/shadow) | mail k.mitnik@127.0.0.1
    :ха-ха!: :ха-ха!: :ха-ха!: :ха-ха!: :ха-ха!:
    Я конечно не гений Юникса, но про теневые файлы паролей, мэйл и лупбэки имею понятие :улыб:

    "Цени олдскул Вася, и не ведись на моду" © - Нагано.

  • Вань, про loopback - маразм написал.
    Эта строка - чистый стеб:миг:Если не в курсе, то поищи в Яндексе, кто такой Кевин Митник:улыб:

  • Сегодня утром посидел, благо выходной, подумал над твоим вопросом и написал следующее:

    #!/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

    Смысл всего этого заключен буквально в одной строке:миг:

  • P.S. Скрипт реализует задание которое ты спрашивал в аське (по крайней мере, как я его тогда понял), а не то, что ты сейчас спрашиваешь на форуме.

  • Я знаю кто такой Митник :улыб::)

    "Цени олдскул Вася, и не ведись на моду" © - Нагано.

Записей на странице:

Перейти в форум

Модератор: