- Bash Brainstorm ,
gpl77, 21:43 , 23-Мрт-13 (1) +1 > Задача: Заменить в тексте все буквы русского алфавита на схожие по-написанию латинские. гос. контракты замыливаем ? :-)
- Bash Brainstorm ,
pavlinux, 23:00 , 23-Мрт-13 (2)> Поехали...На 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 ,
Аноним, 08:37 , 24-Мрт-13 (3)>> Поехали... > На sed вот так, но чёй-то долго...А как же: >>>Только bash, по возможности POISX если надо быстро, то чистый sh сильно противопоказан. А из тулсов - самый подходяший - tr ... вот только multibyte он не понимает :( Можно конечно попробовать изврат - iconv UTF8->KOI8R | tr ... Лучше налабай на сях или жабе. Я кстати буквально на днях видел на Go ~30 строк)
- Bash Brainstorm ,
LSTemp, 07:03 , 25-Мрт-13 (4)>>> Поехали... >> На sed вот так, но чёй-то долго... > А как же: >>>>Только bash, по возможности POISX > если надо быстро, то чистый sh сильно противопоказан. > А из тулсов - самый подходяший - tr ... вот только multibyte > он не понимает :( а нахрен тут мульт - два набора по 30 символов (грубо - из постановки задачи)? свою таблицу и все - скармливай ее. > Можно конечно попробовать изврат - iconv UTF8->KOI8R | tr ... > Лучше налабай на сях или жабе. Я кстати буквально на днях видел > на Go ~30 строк)
- Bash Brainstorm ,
Ы, 06:01 , 26-Мрт-13 (8)>> А из тулсов - самый подходяший - tr ... вот только multibyte он не понимает :( > а нахрен тут мульт - два набора по 30 символов (грубо - > из постановки задачи)? свою таблицу и все - скармливай ее.Аааа .... дык ты не в теме! UTF8 - потому что! :) echo "АБЫРВАЛГ-oh, that Russians" | hd -cb И померкуй что к чему. Или сразу чего Павлинукс просил. Хрен-редьки ... :)
- Bash Brainstorm ,
LSTemp, 03:08 , 28-Мрт-13 (10)>>> А из тулсов - самый подходяший - tr ... вот только multibyte он не понимает :( >> а нахрен тут мульт - два набора по 30 символов (грубо - >> из постановки задачи)? свою таблицу и все - скармливай ее. > Аааа .... дык ты не в теме! UTF8 - потому что! :) Не в теме конечно. Никогда про UTF не слышал... > echo "АБЫРВАЛГ-oh, that Russians" | hd -cb > И померкуй что к чему. Или сразу чего Павлинукс просил. Хрен-редьки ... > :) померкуй про iconv,recode,enconv и найди для каждой утили по паре причин в чем каждая POSIX не соответствует, а потом уж свое echo разевай. PS условия читай: нет ни слова про UTF - значит нет для меня этой проблемы (как факт) при разработке кода и методов решения задачи.
- Bash Brainstorm ,
LSTemp, 04:25 , 28-Мрт-13 (11)>[оверквотинг удален] > -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, 07:05 , 25-Мрт-13 (5)>[оверквотинг удален] > Только 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, 07:13 , 25-Мрт-13 (6)> Задача: Заменить в тексте все буквы русского алфавита на схожие по-написанию латинские. > Только 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, 17:05 , 25-Мрт-13 (7)>[оверквотинг удален] >> >> #!/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, 01:09 , 28-Мрт-13 (9)> НЮХ на H|-0Х не заменять! :) ХАКЕР -> XAKEP (ксэкеп) можно!Я давал повод к такому обращению? - Bash Brainstorm ,
LSTemp, 06:31 , 28-Мрт-13 (13)>[оверквотинг удален] >>> 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, 03:08 , 05-Апр-13 (15)> Из постов выше вопрос возникает: исходная и конечная CP для решения задачи > занчения имеют? Если да, то уточните задачу.Пиши в любой, для кодировок есть iconv;
- Bash Brainstorm ,
pavlinux, 15:14 , 08-Апр-13 (17)>> Пиши в любой, для кодировок есть iconv; > Вы в самом деле придурки или просто пост №3 не читали?Спасибо. Не зачёт! Приходите летом на перездачу. В задаче есть все необходмые условия.
- Bash Brainstorm ,
LSTemp, 04:59 , 28-Мрт-13 (12)>[оверквотинг удален] > Только 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, 00:58 , 12-Апр-13 (18)А вы и не найдейтесь, ответов небудет. Я не ЕГЭээээээ
- Bash Brainstorm ,
universite, 18:28 , 28-Июн-13 (19)> Задача: Заменить в тексте все буквы русского алфавита на схожие по-написанию латинские. есть утилитка replace из поставки Mysql ... REPLACE(1) MySQL Database System REPLACE(1) - Bash Brainstorm ,
Andrey Mitrofanov, 19:07 , 28-Июн-13 (20)> Задача: Заменить в тексте все буквы русского алфавита на схожие по-написанию латинские. > Только 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, 19:12 , 28-Июн-13 (21)> $ _ Башизм%) всё-таки, но "дополнительные балы за --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, 23:29 , 28-Июн-13 (22)> Задача: Заменить в тексте все буквы русского алфавита на схожие по-написанию латинские. #!/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, 13:07 , 30-Июн-13 (23)>> Задача: Заменить в тексте все буквы русского алфавита на схожие по-написанию латинские. > #!/bin/bash --posix > echo -n "$CHAR" [ "$CHAR" ] && echo -n "$CHAR" || echo Там же наверху _видно_, что с bash --posix _перевод строки_ нужно отдельно камлать.
- Bash Brainstorm ,
John, 18:59 , 30-Июн-13 (24)>>> Задача: Заменить в тексте все буквы русского алфавита на схожие по-написанию латинские. >> #!/bin/bash --posix >> echo -n "$CHAR" > [ "$CHAR" ] && echo -n "$CHAR" || echo > Там же наверху _видно_, что с bash --posix _перевод строки_ нужно отдельно > камлать.Не понял, что Вы имели ввиду. Указанный мною код работает.
- Bash Brainstorm ,
Andrey Mitrofanov, 19:36 , 30-Июн-13 (25)>>>> Задача: Заменить в тексте все буквы русского алфавита на схожие по-написанию латинские. >>> #!/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, 19:37 , 30-Июн-13 (26)> $ 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, 22:09 , 30-Июн-13 (27)>>> Задача: Заменить в тексте все буквы русского алфавита на схожие по-написанию латинские. >> #!/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, 02:24 , 29-Июл-13 (29)> С данной конструкцией работает как надо.Ваще жопа, проц на 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, 02:21 , 29-Июл-13 (28)> Поехали...Тестовый текст: Война и Мир (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, 02:14 , 04-Авг-13 (30) #!/bin/bash --posixIFS='' 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, 03:23 , 04-Авг-13 (31)Ver. 2 #!/bin/bash --posixIFS='' 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 ,
Аноним, 23:02 , 04-Авг-13 (32)Молодец - дожал таки! :-) Павлинкс - только один вопрос: а зачем оно? Ну только чесно, я чёйто как извилину не напрягаю для серьёзного чего применения не вижу ... Ы?
- Bash Brainstorm ,
pavlinux, 00:17 , 05-Авг-13 (33)> 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 ,
Андрей, 10:39 , 09-Авг-13 (38)Чисто для поднятия ЧСВ. Если использовать iconv, то можно обойтись и без этого кода на bash. Есть кодировка, в которой уже указанная в задании подмена сделана. :) На старых машинах типа ЕС ЭВМ использовалась. ;) Но это не POSIX.
- Bash Brainstorm ,
LSTemp, 00:33 , 07-Авг-13 (34)ну это уже 2-а прохода по тексту. или циклическая обработка веса каждого символа за один проход (что думаю по производительности на интерпритаторе будет хуже). тут в реале тестировать надо - экономия времени выйдет (на эти 15 секунд) за дополнительный проход по тексту или нет.
- Bash Brainstorm ,
LSTemp, 08:21 , 09-Авг-13 (35)> ну это уже 2-а прохода по тексту. или циклическая обработка веса каждого > символа за один проход (что думаю по производительности на интерпритаторе будет > хуже). тут в реале тестировать надо - экономия времени выйдет (на > эти 15 секунд) за дополнительный проход по тексту или нет.кстати у Хаффмана был алгоритм сжатия, который основывался как раз на анализе частоты встечающихся в тексте сиволов. потом наиболе частые символы кодировались короткой битовой последовательностью, а самые редкие наиболее длинной. Двухпроходной алгоритм (анализ и составение словаря, потом кодирование=сжатие) я как-то давным давно делал, но вроде как есть реализации и за один проход (опять же думаю, что для интерпритатора это мало подойдет по скорости). но попробуй алгоритмы погуглить... кто знает... мне кажется это наиболее близко к твоей задаче.
- Bash Brainstorm ,
Andrey Mitrofanov, 09:23 , 09-Авг-13 (36)>> ну это уже 2-а прохода по тексту. или циклическая обработка веса каждого >> символа за один проход (что думаю по производительности на интерпритаторе будет >> хуже). тут в реале тестировать надо - экономия времени выйдет (на >> эти 15 секунд) за дополнительный проход по тексту или нет. > кстати у Хаффмана был алгоритм сжатияКстати, да. Павлин, выкидываешь из естественного ресского текста буквы е-о-а и получаешь сжатие процентов на... 5? и текст остаётся читаемым. Ну, то есть теми, кто Тьюринга прошёл.
- Bash Brainstorm ,
Андрей, 10:29 , 09-Авг-13 (37)>[оверквотинг удален] >> хуже). тут в реале тестировать надо - экономия времени выйдет (на >> эти 15 секунд) за дополнительный проход по тексту или нет. > кстати у Хаффмана был алгоритм сжатия, который основывался как раз на анализе > частоты встечающихся в тексте сиволов. потом наиболе частые символы кодировались короткой > битовой последовательностью, а самые редкие наиболее длинной. Двухпроходной алгоритм > (анализ и составение словаря, потом кодирование=сжатие) я как-то давным давно делал, > но вроде как есть реализации и за один проход (опять же > думаю, что для интерпритатора это мало подойдет по скорости). но попробуй > алгоритмы погуглить... кто знает... мне кажется это наиболее близко к твоей > задаче.Однопроходный алгоритм очень простой. Там частота использования символов задана заранее, а не вычисляется по текущему тексту. Частота использования символов уже посчитана лингвистами и криптографами достаточно давно и практически для всех современных языков. Погугли.
- Bash Brainstorm ,
LSTemp, 11:14 , 09-Авг-13 (39)>[оверквотинг удален] >>> эти 15 секунд) за дополнительный проход по тексту или нет. >> кстати у Хаффмана был алгоритм сжатия, который основывался как раз на анализе >> частоты встечающихся в тексте сиволов. потом наиболе частые символы кодировались короткой >> битовой последовательностью, а самые редкие наиболее длинной. Двухпроходной алгоритм >> (анализ и составение словаря, потом кодирование=сжатие) я как-то давным давно делал, >> но вроде как есть реализации и за один проход (опять же >> думаю, что для интерпритатора это мало подойдет по скорости). но попробуй >> алгоритмы погуглить... кто знает... мне кажется это наиболее близко к твоей >> задаче. > Однопроходный алгоритм очень простой. Там частота использования символов задана заранее, средняя статистика. > а не вычисляется по текущему тексту. Частота использования символов уже посчитана в алгоритме сжатия Хаффмана - именно высчитывается. и как я уже говорил для наиболее частого символа выбирается наиболее короткая последовательность битов для кодирования, для наиболее редкого - самая дляинная. причем битовые коды для каждого символа подбираются таким образом, чтобы вся результирующа последовательность битов однозначно определяла каждый симовл. т.е не может быть кода 01 для буквы А (которая чаще всего всречается - просто пример) и кода 01* для буквы Я (которая встречается реже всего в тексте). а так - да статистика рулит. еще лет 25-ть назад, когда на ключе стучал - было че-то там СЕНОХРЕНВСПОМНЮ - именно наиболее встречающиеся буквы... ) > лингвистами и криптографами достаточно давно и практически для всех современных языков. > Погугли. если есть конкретный неизменяемый текст, то по производительности в любом случае лучше создать собственный словарь частоты вхождения симолов - это придется сделать всего один раз и временные затраты тут не критичны совсем. полсе просто транслировать используюя данный словарь.
- Bash Brainstorm ,
LSTemp, 11:42 , 09-Авг-13 (40)>> Однопроходный алгоритм очень простой. Там частота использования символов задана заранее, понял что Вы хотели сказать. стормозил чуть-чуть.. и распекался практически о том же).
- Bash Brainstorm ,
pavlinux, 19:40 , 11-Авг-13 (41)>>[оверквотинг удален] > Частота использования символов уже посчитана лингвистами и криптографами > достаточно давно и практически для всех современных языков. Переделанная версия, с учётом частотности букв. http://ru.wikipedia.org/wiki/%D0%A7%D0%B... #!/bin/bash --posixIFS='' 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, 02:55 , 12-Авг-13 (42)>>>[оверквотинг удален] > 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 --posixIFS='' 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, 10:12 , 12-Авг-13 (43)>> 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, 10:16 , 12-Авг-13 (44)> while read -r -N 1 char > do > case $char in Вот тебе _самый_ частотный %) фикс: \ ) echo -n ' ';; > [[:lower:]]) И да, похоже, фигня с не-bash-ами не прокатит... :/
- Bash Brainstorm ,
Andrey Mitrofanov, 10:22 , 12-Авг-13 (45)> Вот тебе _самый_ частотный %) фикс: > \ ) echo -n ' ';; И самый-самый: [^оеарсухОЕАНТРСВКМХ]) printf "%s" "$char";; //да-да, echo -n, посикс...
- Bash Brainstorm ,
pavlinux, 13:37 , 12-Авг-13 (46)> И самый-самый: > [^оеарсухОЕАНТРСВКМХ]) 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 --posixIFS='' 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, 16:02 , 12-Авг-13 (47) #!/bin/sh --posixIFS='' # 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, 02:36 , 13-Авг-13 (48) #!/bin/bash --posixIFS='' # 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 --posixIFS='' # 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, 03:16 , 13-Авг-13 (49)А можно на гитхаб? А то сложно diff'ы искать :)
- Bash Brainstorm ,
pavlinux, 03:32 , 13-Авг-13 (50) - Bash Brainstorm ,
Andrey Mitrofanov, 10:04 , 13-Авг-13 (51)> Аццкий разогн!!! Ж=-) > 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, 12:14 , 13-Авг-13 (52)>> 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 --posixIFS='' # 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, 14:14 , 13-Авг-13 (53)> Ужасно тормознутая версия, видимо у баша проблемы с операциями выборки из массива. real 22m29.780s user 22m23.740s sys 0m1.871s :)
- Bash Brainstorm ,
pavlinux, 19:33 , 13-Авг-13 (54) $ 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, 04:47 , 15-Авг-13 (55)>[оверквотинг удален] > 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, 22:39 , 10-Янв-14 (56)А чо всё молчали??? :D
cat file.txt | sed 'y/АВЕКМНОРСТХаеорсух/ABEKMHOPCTXaeopcyx/';
|