URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9656
[ Назад ]

Исходное сообщение
"Bash Brainstorm  "

Отправлено pavlinux , 23-Мрт-13 20:28 
Задача: Заменить в тексте все буквы русского алфавита на схожие по-написанию латинские.

Только bash, по возможности POISX, те начинаться со строки.


#!/bin/bash --posix

RUS_CAP=(А В Е К М Н О Р С Т Х)
LAT_CAP=(A B E K M H O P C T X)

RUS_LET=(а е о р с у х)
LAT_LET=(a e o p c y x)


---

Поехали...  


Содержание

Сообщения в этом обсуждении
"Bash Brainstorm  "
Отправлено gpl77 , 23-Мрт-13 21:43 
> Задача: Заменить в тексте все буквы русского алфавита на схожие по-написанию латинские.

гос. контракты замыливаем ?

:-)


"Bash Brainstorm  "
Отправлено pavlinux , 23-Мрт-13 23:00 
> Поехали...

На sed вот так, но чёй-то долго...


cat $1 | sed \
        -e 's/А/A/g' -e 's/В/B/g' \
        -e 's/Е/E/g' -e 's/К/K/g' \
        -e 's/М/M/g' -e 's/Н/H/g' \
        -e 's/О/O/g' -e 's/Р/P/g' \
        -e 's/С/C/g' -e 's/Т/T/g' \
        -e 's/Х/X/g' -e 's/а/a/g' \
        -e 's/е/e/g' -e 's/о/o/g' \
        -e 's/р/p/g' -e 's/с/c/g' \
        -e 's/у/y/g' -e 's/х/x/g';


"Bash Brainstorm  "
Отправлено Аноним , 24-Мрт-13 08:37 
>> Поехали...
> На sed вот так, но чёй-то долго...

А как же:
>>>Только bash, по возможности POISX

если надо быстро, то чистый sh сильно противопоказан.
А из тулсов - самый подходяший - tr ... вот только multibyte он не понимает :(
Можно конечно попробовать изврат - iconv UTF8->KOI8R | tr  ...

Лучше налабай на сях или жабе. Я кстати буквально на днях видел на Go ~30 строк)


"Bash Brainstorm  "
Отправлено LSTemp , 25-Мрт-13 07:03 
>>> Поехали...
>> На sed вот так, но чёй-то долго...
> А как же:
>>>>Только bash, по возможности POISX
> если надо быстро, то чистый sh сильно противопоказан.
> А из тулсов - самый подходяший - tr ... вот только multibyte
> он не понимает :(

а нахрен тут мульт - два набора по 30 символов (грубо - из постановки задачи)? свою таблицу и все - скармливай ее.

> Можно конечно попробовать изврат - iconv UTF8->KOI8R | tr  ...
> Лучше налабай на сях или жабе. Я кстати буквально на днях видел
> на Go ~30 строк)


"Bash Brainstorm  "
Отправлено Ы , 26-Мрт-13 06:01 
>> А из тулсов - самый подходяший - tr ... вот только multibyte он не понимает :(
> а нахрен тут мульт - два набора по 30 символов (грубо -
> из постановки задачи)? свою таблицу и все - скармливай ее.

Аааа .... дык ты не в теме! UTF8 - потому что! :)
echo "АБЫРВАЛГ-oh, that Russians" | hd -cb
И померкуй что к чему. Или сразу чего Павлинукс просил. Хрен-редьки ... :)


"Bash Brainstorm  "
Отправлено LSTemp , 28-Мрт-13 03:08 
>>> А из тулсов - самый подходяший - tr ... вот только multibyte он не понимает :(
>> а нахрен тут мульт - два набора по 30 символов (грубо -
>> из постановки задачи)? свою таблицу и все - скармливай ее.
> Аааа .... дык ты не в теме! UTF8 - потому что! :)

Не в теме конечно. Никогда про UTF не слышал...

> echo "АБЫРВАЛГ-oh, that Russians" | hd -cb
> И померкуй что к чему. Или сразу чего Павлинукс просил. Хрен-редьки ...
> :)

померкуй про iconv,recode,enconv и найди для каждой утили по паре причин в чем каждая POSIX не соответствует, а потом уж свое echo разевай.

PS
условия читай: нет ни слова про UTF - значит нет для меня этой проблемы (как факт) при разработке кода и методов решения задачи.


"Bash Brainstorm  "
Отправлено LSTemp , 28-Мрт-13 04:25 
>[оверквотинг удален]
>         -e 's/С/C/g' -e 's/Т/T/g'
> \
>         -e 's/Х/X/g' -e 's/а/a/g'
> \
>         -e 's/е/e/g' -e 's/о/o/g'
> \
>         -e 's/р/p/g' -e 's/с/c/g'
> \
>         -e 's/у/y/g' -e 's/х/x/g';
>

[cut]


"Bash Brainstorm  "
Отправлено LSTemp , 25-Мрт-13 07:05 
>[оверквотинг удален]
> Только bash, по возможности POISX, те начинаться со строки.
>
 
> #!/bin/bash --posix
> RUS_CAP=(А В Е К М Н О Р С Т Х)
> LAT_CAP=(A B E K M H O P C T X)
> RUS_LET=(а е о р с у х)
> LAT_LET=(a e o p c y x)
>

> ---
> Поехали...

опять студентов гнобишь? )


"Bash Brainstorm  "
Отправлено LSTemp , 25-Мрт-13 07:13 
> Задача: Заменить в тексте все буквы русского алфавита на схожие по-написанию латинские.
> Только bash, по возможности POISX, те начинаться со строки.
>
 
> #!/bin/bash --posix
> RUS_CAP=(А В Е К М Н О Р С Т Х)
> LAT_CAP=(A B E K M H O P C T X)
> RUS_LET=(а е о р с у х)
> LAT_LET=(a e o p c y x)
>

> ---

приведенное начало кода - это необходимое условие решения задачи? именно ч/з ЭТО решать? )

> Поехали...


"Bash Brainstorm  "
Отправлено pavlinux , 25-Мрт-13 17:05 
>[оверквотинг удален]
>>
 
>> #!/bin/bash --posix
>> RUS_CAP=(А В Е К М Н О Р С Т Х)
>> LAT_CAP=(A B E K M H O P C T X)
>> RUS_LET=(а е о р с у х)
>> LAT_LET=(a e o p c y x)
>>

>> ---
> приведенное начало кода - это необходимое условие решения задачи? именно ч/з ЭТО
> решать?

Нет. Обязательное только bash (доп. плюс за --posix).

НЮХ на H|-0Х не заменять! :) ХАКЕР -> XAKEP (ксэкеп) можно!


"Bash Brainstorm  "
Отправлено LSTemp , 28-Мрт-13 01:09 
> НЮХ на H|-0Х не заменять! :) ХАКЕР -> XAKEP (ксэкеп) можно!

Я давал повод к такому обращению?


"Bash Brainstorm  "
Отправлено LSTemp , 28-Мрт-13 06:31 
>[оверквотинг удален]
>>> RUS_CAP=(А В Е К М Н О Р С Т Х)
>>> LAT_CAP=(A B E K M H O P C T X)
>>> RUS_LET=(а е о р с у х)
>>> LAT_LET=(a e o p c y x)
>>>
>>> ---
>> приведенное начало кода - это необходимое условие решения задачи? именно ч/з ЭТО
>> решать?
> Нет. Обязательное только bash (доп. плюс за --posix).
> НЮХ на H|-0Х не заменять! :) ХАКЕР -> XAKEP (ксэкеп) можно!

Из постов выше вопрос возникает: исходная и конечная CP для решения задачи занчения имеют? Если да, то уточните задачу.



"Bash Brainstorm  "
Отправлено pavlinux , 05-Апр-13 03:08 
> Из постов выше вопрос возникает: исходная и конечная CP для решения задачи
> занчения имеют? Если да, то уточните задачу.

Пиши в любой, для кодировок есть iconv;


"Bash Brainstorm  "
Отправлено pavlinux , 08-Апр-13 15:14 
>> Пиши в любой, для кодировок есть iconv;
> Вы в самом деле придурки или просто пост №3 не читали?

Спасибо. Не зачёт! Приходите летом на перездачу.  

В задаче есть все необходмые условия.


"Bash Brainstorm  "
Отправлено LSTemp , 28-Мрт-13 04:59 
>[оверквотинг удален]
> Только bash, по возможности POISX, те начинаться со строки.
>
 
> #!/bin/bash --posix
> RUS_CAP=(А В Е К М Н О Р С Т Х)
> LAT_CAP=(A B E K M H O P C T X)
> RUS_LET=(а е о р с у х)
> LAT_LET=(a e o p c y x)
>

> ---
> Поехали...

[cut]



"Bash Brainstorm  "
Отправлено pavlinux , 12-Апр-13 00:58 
А вы и не найдейтесь, ответов небудет. Я не ЕГЭээээээ

"Bash Brainstorm  "
Отправлено universite , 28-Июн-13 18:28 
> Задача: Заменить в тексте все буквы русского алфавита на схожие по-написанию латинские.

есть утилитка replace из поставки Mysql ...
REPLACE(1)                   MySQL Database System                  REPLACE(1)


"Bash Brainstorm  "
Отправлено Andrey Mitrofanov , 28-Июн-13 19:07 
> Задача: Заменить в тексте все буквы русского алфавита на схожие по-написанию латинские.
> Только bash, по возможности POISX, те начинаться со строки.
> Поехали...

Три месяца прошло. Вот, смотрю тема пользуется популярностью, придумал :-D пол-решения для написания tr на _чистом_ bash-е:

$ echo 123 |while read -N 1 char; do echo "$((++i)): >>$char<<"; done
1: >>1<<
2: >>2<<
3: >>3<<
4: >>
<<
$ _


"Bash Brainstorm  "
Отправлено Andrey Mitrofanov , 28-Июн-13 19:12 
> $ _

Башизм%) всё-таки, но "дополнительные балы за --posix"(7) забираю:

$ sh -c 'echo 123 |while read -N 1 char; do echo "$((++i)): >>$char<<"; done'
read: 1: Illegal option -N
$ bash --posix -c 'echo 123 |while read -N 1 char; do echo "$((++i)): >>$char<<"; done'
1: >>1<<
2: >>2<<
3: >>3<<
4: >><<
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Июн 25  2012 /bin/sh -> dash
$ _


"Bash Brainstorm  "
Отправлено John , 28-Июн-13 23:29 
> Задача: Заменить в тексте все буквы русского алфавита на схожие по-написанию латинские.

#!/bin/bash --posix

while read -n 1 CHAR
do
    CHAR="${CHAR/А/A}"
    CHAR="${CHAR/В/B}"
    CHAR="${CHAR/Е/E}"
    CHAR="${CHAR/К/K}"
    CHAR="${CHAR/М/M}"
    CHAR="${CHAR/Н/H}"
    CHAR="${CHAR/О/O}"
    CHAR="${CHAR/Р/P}"
    CHAR="${CHAR/С/C}"
    CHAR="${CHAR/Т/T}"
    CHAR="${CHAR/Х/X}"
    CHAR="${CHAR/а/a}"
    CHAR="${CHAR/е/e}"
    CHAR="${CHAR/о/o}"
    CHAR="${CHAR/р/p}"
    CHAR="${CHAR/с/c}"
    CHAR="${CHAR/у/y}"
    CHAR="${CHAR/х/x}"

    echo -n "$CHAR"
done


"Bash Brainstorm  "
Отправлено Andrey Mitrofanov , 30-Июн-13 13:07 
>> Задача: Заменить в тексте все буквы русского алфавита на схожие по-написанию латинские.
> #!/bin/bash --posix
>     echo -n "$CHAR"

[ "$CHAR" ] && echo -n "$CHAR" || echo


Там же наверху _видно_, что с bash --posix _перевод строки_ нужно отдельно камлать.


"Bash Brainstorm  "
Отправлено John , 30-Июн-13 18:59 
>>> Задача: Заменить в тексте все буквы русского алфавита на схожие по-написанию латинские.
>> #!/bin/bash --posix
>>     echo -n "$CHAR"
> [ "$CHAR" ] && echo -n "$CHAR" || echo
> Там же наверху _видно_, что с bash --posix _перевод строки_ нужно отдельно
> камлать.

Не понял, что Вы имели ввиду. Указанный мною код работает.


"Bash Brainstorm  "
Отправлено Andrey Mitrofanov , 30-Июн-13 19:36 
>>>> Задача: Заменить в тексте все буквы русского алфавита на схожие по-написанию латинские.
>>> #!/bin/bash --posix
>>>     echo -n "$CHAR"
>> [ "$CHAR" ] && echo -n "$CHAR" || echo
>> Там же наверху _видно_, что с bash --posix _перевод строки_ нужно отдельно
>> камлать.
> Не понял, что Вы имели ввиду. Указанный мною код работает.

Посмотри внимательно на строчку 4: в моих соощениях №№29,21.

Но я тоже, похоже, ошибся там не от --posix изменения. 4 комманды с 3 разными вариантами выхода при одном входе:

$ echo 1 3 |while unset IFS; read -N 1 char; do echo "$((++i)): >>$char<<"; done

$ echo 1 3 |while unset IFS; read -N 1 char; do echo "$((++i)): >>$char<<"; done

$ echo 1 3 |bash --posix -c 'while IFS= read -N 1 char; do echo "$((++i)): >>$char<<"; done'

$ echo 1 3 |bash --posix -c 'while unset IFS; read -N 1 char; do echo "$((++i)): >>$char<<"; done'

+++Ну, пожалуй, ещё месяца на 4 тему жодно закрыть.


"Bash Brainstorm  "
Отправлено Andrey Mitrofanov , 30-Июн-13 19:37 
> $ echo 1 3 |while unset IFS; read -N 1 char; do
> echo "$((++i)): >>$char<<"; done
> $ echo 1 3 |while unset IFS; read -N 1 char; do
> echo "$((++i)): >>$char<<"; done

:/ ''while IFS= read''


"Bash Brainstorm  "
Отправлено John , 30-Июн-13 22:09 
>>> Задача: Заменить в тексте все буквы русского алфавита на схожие по-написанию латинские.
>> #!/bin/bash --posix
>>     echo -n "$CHAR"
> [ "$CHAR" ] && echo -n "$CHAR" || echo
> Там же наверху _видно_, что с bash --posix _перевод строки_ нужно отдельно
> камлать.

Да, я не посмотрел как будет с переводом строк. С данной конструкцией работает как надо.
#!/bin/bash --posix

while read -n 1 CHAR
do
    CHAR="${CHAR/А/A}"
    CHAR="${CHAR/В/B}"
    CHAR="${CHAR/Е/E}"
    CHAR="${CHAR/К/K}"
    CHAR="${CHAR/М/M}"
    CHAR="${CHAR/Н/H}"
    CHAR="${CHAR/О/O}"
    CHAR="${CHAR/Р/P}"
    CHAR="${CHAR/С/C}"
    CHAR="${CHAR/Т/T}"
    CHAR="${CHAR/Х/X}"
    CHAR="${CHAR/а/a}"
    CHAR="${CHAR/е/e}"
    CHAR="${CHAR/о/o}"
    CHAR="${CHAR/р/p}"
    CHAR="${CHAR/с/c}"
    CHAR="${CHAR/у/y}"
    CHAR="${CHAR/х/x}"

    [ "$CHAR" ] && echo -n "$CHAR" || echo
done


"Bash Brainstorm  "
Отправлено pavlinux , 29-Июл-13 02:24 
> С данной конструкцией работает как надо.

Ваще жопа, проц на 100% нагружает! И оно строки переносит!!!

----


$ time lzma -cd  VNM.txt.lzma | sed -e 's/А/A/g' -e 's/В/B/g' \
                                    -e 's/Е/E/g' -e 's/К/K/g' \
                                    -e 's/М/M/g' -e 's/Н/H/g' \
                                    -e 's/О/O/g' -e 's/Р/P/g' \
                                    -e 's/С/C/g' -e 's/Т/T/g' \
                                    -e 's/Х/X/g' -e 's/а/a/g' \
                                    -e 's/е/e/g' -e 's/о/o/g' \
                                    -e 's/р/p/g' -e 's/с/c/g' \
                                    -e 's/у/y/g' -e 's/х/x/g' \
                                                   > /dev/null;  

real    0m2.387s
user    0m2.488s
sys     0m0.037s



"Bash Brainstorm  "
Отправлено pavlinux , 29-Июл-13 02:21 
> Поехали...

Тестовый текст: Война и Мир (4 тома, UTF-8)

http://pavlinux.ru/VNM.txt.lzma (5.328.556 байт текста).

Контрольные суммы
Оргинал:

$ md5sum VNM.txt
398d07d2988d50f8f9875790761cdb7d  VNM.txt

Выходной:

$ md5sum OUT.txt
31ed88cff54827fa178922edc194200e  OUT.txt


"Bash Brainstorm  "
Отправлено pavlinux , 04-Авг-13 02:14 

#!/bin/bash --posix

IFS=''

while read -n 1 line
     do
        case $line in
         [[:lower:]])
                  case $line in
                        "а")    echo -n "a"; continue ;;
                        "о")    echo -n "o"; continue ;;
                        "е")    echo -n "e"; continue ;;
                        "р")    echo -n "p"; continue ;;
                        "с")    echo -n "c"; continue ;;
                        "у")    echo -n "y"; continue ;;
                        "х")    echo -n "x"; continue ;;
                        *)      echo -n $line; continue ;;
                  esac
       ;;
       [[:upper:]])
                   case $line in
                        "А")    echo -n "A"; continue ;;
                        "Е")    echo -n "E"; continue ;;
                        "О")    echo -n "O"; continue ;;
                        "В")    echo -n "B"; continue ;;
                        "К")    echo -n "K"; continue ;;
                        "М")    echo -n "M"; continue ;;
                        "Н")    echo -n "H"; continue ;;
                        "Р")    echo -n "P"; continue ;;
                        "С")    echo -n "C"; continue ;;
                        "Т")    echo -n "T"; continue ;;
                        "Х")    echo -n "X"; continue ;;
                        *)      echo -n  $line; continue ;;
                  esac
        ;;
        *) echo -ne $line; continue  ;;
   esac
done


Войну и Мир за 2 минуты.

$ time lzma -cd  VNM.txt.lzma | ./recode.sh > /dev/null

real    1m52.218s
user    1m40.335s
sys     0m11.723s

----
Без разделения на upper и lower, примерно на 20 сек. дольше.  


"Bash Brainstorm  "
Отправлено pavlinux , 04-Авг-13 03:23 
Ver. 2

 
#!/bin/bash --posix

IFS=''

while read -r -N 1 char
     do
       case $char in
         [[:lower:]])
                  case $char in
                        "а")    printf "%s" "a";;
                        "о")    printf "%s" "o";;
                        "е")    printf "%s" "e";;
                        "р")    printf "%s" "p";;
                        "с")    printf "%s" "c";;
                        "у")    printf "%s" "y";;
                        "х")    printf "%s" "x";;
                        *)      printf "%s" $char;;
                  esac
       ;;
       [[:upper:]])
                   case $char in
                        "А")   printf "%s" "A";;
                        "Е")   printf "%s" "E";;
                        "О")   printf "%s" "O";;
                        "В")   printf "%s" "B";;
                        "К")   printf "%s" "K";;
                        "М")   printf "%s" "M";;
                        "Н")   printf "%s" "H";;
                        "Р")   printf "%s" "P";;
                        "С")   printf "%s" "C";;
                        "Т")   printf "%s" "T";;
                        "Х")   printf "%s" "X";;
                        *)     printf "%s" $char;;
                     esac
        ;;
        *) printf "%s" "$char";;
   esac
done

Due to conflicting historical implementations of the echo command, POSIX®
recommends that printf is preferred over echo.


"Bash Brainstorm  "
Отправлено Аноним , 04-Авг-13 23:02 
Молодец - дожал таки! :-)
Павлинкс - только один вопрос: а зачем оно?
Ну только чесно, я чёйто как извилину не напрягаю для серьёзного чего применения не вижу ... Ы?

"Bash Brainstorm  "
Отправлено pavlinux , 05-Авг-13 00:17 
> Moлoдeц - дoжaл тaки! :-)

He-нe-нe, тopмoзилoвo. Xoчy eщё чepeз пoдcтaвлeниe индeкcoв мaccивoв.

Во! Новое задание придумал! :)

Kcтaти, ecли тyт oтcopтиpoвaть бyквы пo чacтoтe иcпoльзoвaния paзгoняeтcя eщё нa 15 ceк.  

> Пaвлинкc - тoлькo oдин вoпpoc: a зaчeм oнo?
> Hy тoлькo чecнo, я чёйтo кaк извилинy нe нaпpягaю для cepьёзнoгo чeгo
> пpимeнeния нe вижy ... Ы?

Ecть пpибop Garmin Edge 800, в нeм ecть pycификaция, тaк вoт этoт пpибop
кopявo oтoбpaжaeт pyccкиe бyквы, тaк бoлee-мeнee cимпaтишнo. :)

Teкcт нa cтpaницax oт пoиcкoвикoв пpятaть мoжнo...


"Bash Brainstorm  "
Отправлено Андрей , 09-Авг-13 10:39 
Чисто для поднятия ЧСВ. Если использовать iconv, то можно обойтись и без этого кода на bash. Есть кодировка, в которой уже указанная в задании подмена сделана. :) На старых машинах типа ЕС ЭВМ использовалась. ;)
Но это не POSIX.


"Bash Brainstorm  "
Отправлено LSTemp , 07-Авг-13 00:33 
ну это уже 2-а прохода по тексту. или циклическая обработка веса каждого символа за один проход (что думаю по производительности на интерпритаторе будет хуже). тут в реале тестировать надо - экономия времени выйдет (на эти 15 секунд) за дополнительный проход по тексту или нет.


"Bash Brainstorm  "
Отправлено LSTemp , 09-Авг-13 08:21 
> ну это уже 2-а прохода по тексту. или циклическая обработка веса каждого
> символа за один проход (что думаю по производительности на интерпритаторе будет
> хуже). тут в реале тестировать надо - экономия времени выйдет (на
> эти 15 секунд) за дополнительный проход по тексту или нет.

кстати у Хаффмана был алгоритм сжатия, который основывался как раз на анализе частоты встечающихся в тексте сиволов. потом наиболе частые символы кодировались короткой битовой последовательностью, а самые редкие наиболее длинной. Двухпроходной алгоритм (анализ и составение словаря, потом кодирование=сжатие) я как-то давным давно делал, но вроде как есть реализации и за один проход (опять же думаю, что для интерпритатора это мало подойдет по скорости). но попробуй алгоритмы погуглить... кто знает... мне кажется это наиболее близко к твоей задаче.


"Bash Brainstorm  "
Отправлено Andrey Mitrofanov , 09-Авг-13 09:23 
>> ну это уже 2-а прохода по тексту. или циклическая обработка веса каждого
>> символа за один проход (что думаю по производительности на интерпритаторе будет
>> хуже). тут в реале тестировать надо - экономия времени выйдет (на
>> эти 15 секунд) за дополнительный проход по тексту или нет.
> кстати у Хаффмана был алгоритм сжатия

Кстати, да. Павлин, выкидываешь из естественного ресского текста буквы е-о-а и получаешь сжатие процентов на... 5? и текст остаётся читаемым. Ну, то есть теми, кто Тьюринга прошёл.


"Bash Brainstorm  "
Отправлено Андрей , 09-Авг-13 10:29 
>[оверквотинг удален]
>> хуже). тут в реале тестировать надо - экономия времени выйдет (на
>> эти 15 секунд) за дополнительный проход по тексту или нет.
> кстати у Хаффмана был алгоритм сжатия, который основывался как раз на анализе
> частоты встечающихся в тексте сиволов. потом наиболе частые символы кодировались короткой
> битовой последовательностью, а самые редкие наиболее длинной. Двухпроходной алгоритм
> (анализ и составение словаря, потом кодирование=сжатие) я как-то давным давно делал,
> но вроде как есть реализации и за один проход (опять же
> думаю, что для интерпритатора это мало подойдет по скорости). но попробуй
> алгоритмы погуглить... кто знает... мне кажется это наиболее близко к твоей
> задаче.

Однопроходный алгоритм очень простой. Там частота использования символов задана заранее, а не вычисляется по текущему тексту. Частота использования символов уже посчитана лингвистами и криптографами достаточно давно и практически для всех современных языков. Погугли.


"Bash Brainstorm  "
Отправлено LSTemp , 09-Авг-13 11:14 
>[оверквотинг удален]
>>> эти 15 секунд) за дополнительный проход по тексту или нет.
>> кстати у Хаффмана был алгоритм сжатия, который основывался как раз на анализе
>> частоты встечающихся в тексте сиволов. потом наиболе частые символы кодировались короткой
>> битовой последовательностью, а самые редкие наиболее длинной. Двухпроходной алгоритм
>> (анализ и составение словаря, потом кодирование=сжатие) я как-то давным давно делал,
>> но вроде как есть реализации и за один проход (опять же
>> думаю, что для интерпритатора это мало подойдет по скорости). но попробуй
>> алгоритмы погуглить... кто знает... мне кажется это наиболее близко к твоей
>> задаче.
> Однопроходный алгоритм очень простой. Там частота использования символов задана заранее,

средняя статистика.

> а не вычисляется по текущему тексту. Частота использования символов уже посчитана

в алгоритме сжатия Хаффмана - именно высчитывается. и как я уже говорил для наиболее частого символа выбирается наиболее короткая последовательность битов для кодирования, для наиболее редкого  - самая дляинная. причем битовые коды для каждого символа подбираются таким образом, чтобы вся результирующа последовательность битов однозначно определяла каждый симовл. т.е не может быть кода 01 для буквы А (которая чаще всего всречается - просто пример) и кода 01* для буквы Я (которая встречается реже всего в тексте). а так  - да статистика рулит. еще лет 25-ть назад, когда на ключе стучал - было че-то там СЕНОХРЕНВСПОМНЮ - именно наиболее встречающиеся буквы... )

> лингвистами и криптографами достаточно давно и практически для всех современных языков.
> Погугли.

если есть конкретный неизменяемый текст, то по производительности в любом случае лучше создать собственный словарь частоты вхождения симолов - это придется сделать всего один раз и временные затраты тут не критичны совсем. полсе просто транслировать используюя данный словарь.



"Bash Brainstorm  "
Отправлено LSTemp , 09-Авг-13 11:42 
>> Однопроходный алгоритм очень простой. Там частота использования символов задана заранее,

понял что Вы хотели сказать. стормозил чуть-чуть.. и распекался практически о том же).


"Bash Brainstorm  "
Отправлено pavlinux , 11-Авг-13 19:40 
>>[оверквотинг удален]
> Частота использования символов уже посчитана лингвистами и криптографами
> достаточно давно и практически для всех современных языков.

Переделанная версия, с учётом частотности букв. http://ru.wikipedia.org/wiki/%D0%A7%D0%B...


#!/bin/bash --posix

IFS=''

while read -r -N 1 char
     do
       case $char in
         [[:lower:]])
                  case $char in                   # вероятность
                        "о")    printf "%s" "o";; # 9.28%
                        "е")    printf "%s" "e";; # 8.66%
                        "а")    printf "%s" "a";; # 8.10%
                        "р")    printf "%s" "p";; # 5.53%
                        "с")    printf "%s" "c";; # 5.45%
                        "у")    printf "%s" "y";; # 2.90%
                        "х")    printf "%s" "x";; # 0.92%
                        *)      printf "%s" $char;;
                  esac
       ;;
       [[:upper:]])
                   case $char in
                        "О")    printf "%s" "O";; # 9.28%
                        "Е")    printf "%s" "E";; # 8.66%
                        "А")    printf "%s" "A";; # 8.10%
                        "Н")    printf "%s" "H";; # 6.35%
                        "Т")    printf "%s" "T";; # 6.30%
                        "Р")    printf "%s" "P";; # 5.53%
                        "С")    printf "%s" "C";; # 5.45%
                        "В")    printf "%s" "B";; # 4.19%
                        "К")    printf "%s" "K";; # 3.47%
                        "М")    printf "%s" "M";; # 3.29%
                        "Х")    printf "%s" "X";; # 0.92%
                        *)      printf "%s" $char;;
                     esac
        ;;
        *) printf "%s" "$char";;
   esac
done

echo

E-e-e-e, от 4 до 9 сек. профита! :)

time cat VnM.txt | /work/recode2.sh  > /dev/null

real    1m43.708s
user    1m31.108s
sys     0m12.323s


"Bash Brainstorm  "
Отправлено pavlinux , 12-Авг-13 02:55 
>>>[оверквотинг удален]
> E-e-e-e, от 4 до 9 сек. профита! :)
> time cat VnM.txt | /work/recode2.sh  > /dev/null
> real    1m43.708s
> user    1m31.108s
> sys     0m12.323s

И ещё ...


#!/bin/sh --posix

IFS=''

while read -r -N 1 char
     do
       case $char in
        [оеарсухОЕАНТРСВКМХ])
                  case $char in
                        "о")    printf "%s" "o";;
                        "е")    printf "%s" "e";;
                        "а")    printf "%s" "a";;
                        "р")    printf "%s" "p";;
                        "с")    printf "%s" "c";;
                        "у")    printf "%s" "y";;
                        "х")    printf "%s" "x";;
                        "О")    printf "%s" "O";;
                        "Е")    printf "%s" "E";;
                        "А")    printf "%s" "A";;
                        "Н")    printf "%s" "H";;
                        "Т")    printf "%s" "T";;
                        "Р")    printf "%s" "P";;
                        "С")    printf "%s" "C";;
                        "В")    printf "%s" "B";;
                        "К")    printf "%s" "K";;
                        "М")    printf "%s" "M";;
                        "Х")    printf "%s" "X";;
                     esac
        ;;
        *)
        printf "%s" "$char"
        ;;
     esac
done

echo

time cat VNM.txt | ./recode5.sh > /dev/null

real    1m34.038s
user    1m20.380s
sys     0m13.405s



"Bash Brainstorm  "
Отправлено Andrey Mitrofanov , 12-Авг-13 10:12 
>> real    1m43.708s
> И ещё ...
> #!/bin/sh --posix
> time cat VNM.txt | ./recode5.sh > /dev/null
> real    1m34.038s

Во-первых, useless use of cat.

Во-вторых, достаточно, видимо было гонять, не меняя shebang,

time bash ./recode5.sh <VNM.txt >/dev/null

В-третьих, заниматься ерундой, так уж:

for sh in bash dash ash tcsh pdksh zsh; do  ##заменить на /etc/shells по вкусу
  if sh1=$(which $sh); then
    echo "+++ $sh"
    time $SH1 ./recode5.sh <VNM.txt >/dev/null
  else
    echo " ??? $sh"
  fi
done


"Bash Brainstorm  "
Отправлено Andrey Mitrofanov , 12-Авг-13 10:16 
> while read -r -N 1 char
>      do
>        case $char in

Вот тебе _самый_ частотный %) фикс:

          \ ) echo -n ' ';;

>          [[:lower:]])

И да, похоже, фигня с не-bash-ами не прокатит... :/


"Bash Brainstorm  "
Отправлено Andrey Mitrofanov , 12-Авг-13 10:22 
> Вот тебе _самый_ частотный %) фикс:
>           \ ) echo -n ' ';;

И самый-самый:

   [^оеарсухОЕАНТРСВКМХ])  printf "%s" "$char";;

//да-да, echo -n, посикс...


"Bash Brainstorm  "
Отправлено pavlinux , 12-Авг-13 13:37 
> И самый-самый:
> [^оеарсухОЕАНТРСВКМХ])  printf "%s" "$char";;

----
$ time ./recode5.sh < VNM.txt > /dev/null

Только с [^оеарсухОЕАНТРСВКМХ])  printf "%s" "$char";;

real    1m26.057s
user    1m19.937s
sys     0m5.885s

Только с пробелом

real    1m24.026s
user    1m17.372s
sys     0m6.359s


#!/bin/sh --posix

IFS=''

while read -r -N 1 char
     do
       case $char in
        ' ')
                printf "%s" ' '
        ;;
        [оеарсухОЕАНТРСВКМХ])
                  case $char in
                        "о")    printf "%s" "o";;
                        "е")    printf "%s" "e";;
                        "а")    printf "%s" "a";;
                        "р")    printf "%s" "p";;
                        "с")    printf "%s" "c";;
                        "у")    printf "%s" "y";;
                        "х")    printf "%s" "x";;
                        "О")    printf "%s" "O";;
                        "Е")    printf "%s" "E";;
                        "А")    printf "%s" "A";;
                        "Н")    printf "%s" "H";;
                        "Т")    printf "%s" "T";;
                        "Р")    printf "%s" "P";;
                        "С")    printf "%s" "C";;
                        "В")    printf "%s" "B";;
                        "К")    printf "%s" "K";;
                        "М")    printf "%s" "M";;
                        "Х")    printf "%s" "X";;
                     esac
        ;;
        *)
        printf "%s" $char
        ;;
     esac
done

echo



"Bash Brainstorm  "
Отправлено pavlinux , 12-Авг-13 16:02 
 
#!/bin/sh --posix

IFS=''

# The encoded symbols
SYMS=оеарсухОЕАНТРСВКМХ
LOW_SYMS=оеарсух
UPP_SYMS=ОЕАНТРСВКМХ

while read -r -N 1 char
     do
       case $char in
        " ")
                printf "%s" " "
        ;;
        [[:lower:]])
                case $char in
                        [$LOW_SYMS])
                                case $char in
                                        "о")    printf "%s" "o";;
                                        "е")    printf "%s" "e";;
                                        "а")    printf "%s" "a";;
                                        "р")    printf "%s" "p";;
                                        "с")    printf "%s" "c";;
                                        "у")    printf "%s" "y";;
                                        "х")    printf "%s" "x";;
                                esac
                        ;;
                esac
        ;;
        [[:upper:]])
                case $char in
                        [$UPP_SYMS])
                                case $char in
                                        "О")    printf "%s" "O";;
                                        "Е")    printf "%s" "E";;
                                        "А")    printf "%s" "A";;
                                        "Н")    printf "%s" "H";;
                                        "Т")    printf "%s" "T";;
                                        "Р")    printf "%s" "P";;
                                        "С")    printf "%s" "C";;
                                        "В")    printf "%s" "B";;
                                        "К")    printf "%s" "K";;
                                        "М")    printf "%s" "M";;
                                        "Х")    printf "%s" "X";;
                                esac
                        ;;
                esac
        ;;
        *)
                printf "%s" $char
        ;;
     esac
done

echo


real    1m17.786s
user    1m12.134s
sys     0m5.358s

---

- При использование [^$LOW_SYMS]) и [^$UPP_SYMS])

real    1m34.277s
user    1m26.699s
sys     0m7.184s

- При использование [^$UPP_SYMS])

real    1m18.631s
user    1m13.319s
sys     0m5.007s


"Bash Brainstorm  "
Отправлено pavlinux , 13-Авг-13 02:36 

#!/bin/bash --posix

IFS=''

# The encoded symbols
SYMS="оеарсухОЕАНТРСВКМХ"

while read -r -N 1 char
     do
        case "$char" in
                [^$SYMS]) printf "%s" "$char";;
                "о")      printf "%s" "o";;
                "е")      printf "%s" "e";;
                "а")      printf "%s" "a";;
                "р")      printf "%s" "p";;
                "с")      printf "%s" "c";;
                "у")      printf "%s" "y";;
                "х")      printf "%s" "x";;
                "О")      printf "%s" "O";;
                "Е")      printf "%s" "E";;
                "А")      printf "%s" "A";;
                "Н")      printf "%s" "H";;
                "Т")      printf "%s" "T";;
                "Р")      printf "%s" "P";;
                "С")      printf "%s" "C";;
                "В")      printf "%s" "B";;
                "К")      printf "%s" "K";;
                "М")      printf "%s" "M";;
                "Х")      printf "%s" "X";;
        esac
done

real    1m19.573s
user    1m14.949s
sys     0m4.424s

В общем, предел... основной тормоз - это посимвольное чтение, скорость работы 65kb/sec :)
---
Аццкий разогн!!! Ж=-)

real    1m4.994s
user    0m56.966s
sys     0m5.837s


#!/bin/bash --posix

IFS=''

# The encoded symbols
SYMS="оеарсухОЕАНТРСВКМХ"

while read -n 1024512 -r line
     do
        while read -r -N 1 char
             do
                case "$char" in
                        [^$SYMS]) printf "%s" "$char";;
                        "о")      printf "%s" "o";;
                        "е")      printf "%s" "e";;
                        "а")      printf "%s" "a";;
                        "р")      printf "%s" "p";;
                        "с")      printf "%s" "c";;
                        "у")      printf "%s" "y";;
                        "х")      printf "%s" "x";;
                        "О")      printf "%s" "O";;
                        "Е")      printf "%s" "E";;
                        "А")      printf "%s" "A";;
                        "Н")      printf "%s" "H";;
                        "Т")      printf "%s" "T";;
                        "Р")      printf "%s" "P";;
                        "С")      printf "%s" "C";;
                        "В")      printf "%s" "B";;
                        "К")      printf "%s" "K";;
                        "М")      printf "%s" "M";;
                        "Х")      printf "%s" "X";;
                esac
        done <<< "$line"
done



"Bash Brainstorm  "
Отправлено universite , 13-Авг-13 03:16 
А можно на гитхаб? А то сложно diff'ы искать :)

"Bash Brainstorm  "
Отправлено pavlinux , 13-Авг-13 03:32 
> А можно на гитхаб? А то сложно diff'ы искать :)

По времени :)
---
https://github.com/pavlinux/rus2lat.sh


"Bash Brainstorm  "
Отправлено Andrey Mitrofanov , 13-Авг-13 10:04 
> Аццкий разогн!!! Ж=-)
> real    1m4.994s

Ну, ты упорный. //Бенчмарк не автоматизировал ещё? Не быть тебе форониксом.

> while read -n 1024512 -r line

И кста, чего не $((100*1000*1000)) или др.?

>      do
>         while read -r -N 1 char

i=0; L=${#line}; while((i<$L)); do
     char=${line:$i:1}

>     case "$char" in
>     esac
>         done <<< "$line"

done

> done

А вот ещё: буферизация вывода + регексп на > чем 1 символ

ou=
while [[ $line =~ ^([^$SYM]*)([$SYM])(.*)$ ]]; do  ###с квотингом rx-а внутири shell м.б. сложности :/
    ou="$ou${BASH_REMATCH[1]}"
    char=${BASH_REMATCH[2]}
    case $char in
        о) ochr=o;;
        [...]
    esac
    ou="$ou$ochr"
    line=${BASH_REMATCH[3]}
done
printf "%s" "$ou$line"


+++
И ещё без "этих ваших" case-ов:

SYMS="оеарсухОЕАНТРСВКМХ"
OSYMS="oeapcyxOEAHTPCBKMX"

#    char=${BASH_REMATCH[2]}
#    case $char in
#        о) ochr=o;;
#        [...]
#    esac
    val="${SYMS%$char*}"
    ochr="${OSYMS:${#val}:1}"
    ou="$ou$ochr"

---БенчИ-давай?!


"Bash Brainstorm  "
Отправлено pavlinux , 13-Авг-13 12:14 
>> while read -n 1024512 -r line
> И кста, чего не $((100*1000*1000)) или др.?

Методом тачевой интерполяции вывел, что больше 1400000 профита нету.

> i=0; L=${#line}; while((i<$L)); do
>     char=${line:$i:1}

((i++)) забыл, иль надо for (i=0; i<$L; i++ ), и $L - лишнее


#!/bin/bash --posix

IFS=''

# The encoded symbols
SYMS="оеарсухОЕАНТРСВКМХ"

while read -r -n 1000000 line
     do
        for ((i=0; i < ${#line}; i++))
           do
                char=${line:$i:1}
                case "$char" in
                        [^$SYMS]) printf "%s" "$char";;
                        "о")      printf "%s" "o";;
                        "е")      printf "%s" "e";;
                        "а")      printf "%s" "a";;
                        "р")      printf "%s" "p";;
                        "с")      printf "%s" "c";;
                        "у")      printf "%s" "y";;
                        "х")      printf "%s" "x";;
                        "О")      printf "%s" "O";;
                        "Е")      printf "%s" "E";;
                        "А")      printf "%s" "A";;
                        "Н")      printf "%s" "H";;
                        "Т")      printf "%s" "T";;
                        "Р")      printf "%s" "P";;
                        "С")      printf "%s" "C";;
                        "В")      printf "%s" "B";;
                        "К")      printf "%s" "K";;
                        "М")      printf "%s" "M";;
                        "Х")      printf "%s" "X";;
                esac
        done
done


Ужасно тормознутая версия, видимо у баша проблемы с операциями выборки из массива.

Приколись, - замени
while read -r -n 1000000 line на
while read -r -N 1000000 line
:)
> ---БенчИ-давай?!

Тестовый текст: Война и Мир (4 тома, UTF-8)
http://pavlinux.ru/VNM.txt.lzma (5.328.556 байт текста).

$ time ./rus2lat.sh < ../VNM.txt > /dev/null
---


"Bash Brainstorm  "
Отправлено pavlinux , 13-Авг-13 14:14 
> Ужасно тормознутая версия, видимо у баша проблемы с операциями выборки из массива.

real    22m29.780s
user    22m23.740s
sys     0m1.871s

:)


"Bash Brainstorm  "
Отправлено pavlinux , 13-Авг-13 19:33 

$ strace -c -f ./rus2lat.sh < ../VNM.txt > /dev/null

^CProcess 8116 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
78.74    0.009034           0    320306           rt_sigprocmask
17.77    0.002039           0     79862           write
  1.58    0.000181           0      1339           read
  0.43    0.000049           2        32         7 open
  0.37    0.000042          14         3           munmap
  0.33    0.000038          38         1           access
  0.30    0.000034           1        33           mmap
  0.24    0.000028           0       846           lseek
  0.24    0.000028           0       425       425 ioctl
  0.00    0.000000           0        25           close
  0.00    0.000000           0        10         4 stat
  0.00    0.000000           0       448           fstat
  0.00    0.000000           0        10           mprotect
  0.00    0.000000           0         3           brk
  0.00    0.000000           0         8           rt_sigaction
  0.00    0.000000           0         1           dup2
  0.00    0.000000           0         1           getpid
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         1           uname
  0.00    0.000000           0         3         1 fcntl
  0.00    0.000000           0         2           getrlimit
  0.00    0.000000           0         1           getuid
  0.00    0.000000           0         1           getgid
  0.00    0.000000           0         1           geteuid
  0.00    0.000000           0         1           getegid
  0.00    0.000000           0         1           getppid
  0.00    0.000000           0         1           getpgrp
  0.00    0.000000           0         1           arch_prctl
------ ----------- ----------- --------- --------- ----------------
100.00    0.011473                403367       437 total

Предыдущая версия с двумя read


^CProcess 15403 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
53.48    1.567855           0   4644228           read
12.31    0.360885           0   1318652           write
11.46    0.335973           0   1318654   1318652 ioctl
10.86    0.318386           0   1318676           fstat
10.60    0.310744           0   1318654           lseek
  0.41    0.011971           1     11886         7 open
  0.30    0.008745           0     29637         1 fcntl
  0.30    0.008670           1     11854           dup2
  0.17    0.004915           0     17805           close
  0.11    0.003308           1      5927           unlink
  0.00    0.000000           0        11         4 stat
  0.00    0.000000           0        33           mmap
  0.00    0.000000           0        10           mprotect
  0.00    0.000000           0         3           munmap
  0.00    0.000000           0         8           brk
  0.00    0.000000           0         8           rt_sigaction
  0.00    0.000000           0        13           rt_sigprocmask
  0.00    0.000000           0         1           access
  0.00    0.000000           0         1           getpid
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         1           uname
  0.00    0.000000           0         2           getrlimit
  0.00    0.000000           0         1           getuid
  0.00    0.000000           0         1           getgid
  0.00    0.000000           0         1           geteuid
  0.00    0.000000           0         1           getegid
  0.00    0.000000           0         1           getppid
  0.00    0.000000           0         1           getpgrp
  0.00    0.000000           0         1           statfs
  0.00    0.000000           0         1           arch_prctl
  0.00    0.000000           0         1           faccessat
------ ----------- ----------- --------- --------- ----------------
100.00    2.931452               9996074   1318664 total

Не вдуплю, из-за чего ошибки ioctl :-]

ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, 0x7fffe7f0bd00) = -1 ENOTTY (Inappropriate ioctl for device)
lseek(0, 0, SEEK_CUR)                   = 0
fstat(0, {st_mode=S_IFREG|0600, st_size=3, ...}) = 0
read(0, "\320", 1)                      = 1
read(0, "\220", 1)                      = 1
fstat(1, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, 0x7fffe7f0b4b0) = -1 ENOTTY (Inappropriate ioctl for device)
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6d389f9000
write(1, "A", 1)                        = 1
ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, 0x7fffe7f0bd00) = -1 ENOTTY (Inappropriate ioctl for device)
lseek(0, 0, SEEK_CUR)                   = 2
fstat(0, {st_mode=S_IFREG|0600, st_size=3, ...}) = 0
read(0, "\n", 1)                        = 1
write(1, "\n", 1)                       = 1
ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, 0x7fffe7f0bd00) = -1 ENOTTY (Inappropriate ioctl for device)
lseek(0, 0, SEEK_CUR)                   = 3
fstat(0, {st_mode=S_IFREG|0600, st_size=3, ...}) = 0
read(0, "", 1)                          = 0
dup2(10, 0)                             = 0
fcntl(10, F_GETFD)                      = 0x1 (flags FD_CLOEXEC)
close(10)                               = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, 0x7fffe7f0be40) = -1 ENOTTY (Inappropriate ioctl for device)
lseek(0, 0, SEEK_CUR)                   = 3
fstat(0, {st_mode=S_IFREG|0640, st_size=3, ...}) = 0
read(0, "", 1)                          = 0


"Bash Brainstorm  "
Отправлено pavlinux , 15-Авг-13 04:47 
>[оверквотинг удален]
> OSYMS="oeapcyxOEAHTPCBKMX"
> #    char=${BASH_REMATCH[2]}
> #    case $char in
> #        о) ochr=o;;
> #        [...]
> #    esac
>     val="${SYMS%$char*}"
>     ochr="${OSYMS:${#val}:1}"
>     ou="$ou$ochr"
> ---БенчИ-давай?!

Чё ты тут нахреначил??? Давай нормальный скрипт, читаемый и форматированный.  


"Bash Brainstorm  "
Отправлено pavlinux , 10-Янв-14 22:39 
А чо всё молчали??? :D


cat file.txt | sed 'y/АВЕКМНОРСТХаеорсух/ABEKMHOPCTXaeopcyx/';