Задача: Заменить в тексте все буквы русского алфавита на схожие по-написанию латинские.Только bash, по возможности POISX, те начинаться со строки.
#!/bin/bash --posixRUS_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)
---Поехали...
> Задача: Заменить в тексте все буквы русского алфавита на схожие по-написанию латинские.гос. контракты замыливаем ?
:-)
> Поехали...На 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';
>> Поехали...
> На sed вот так, но чёй-то долго...А как же:
>>>Только bash, по возможности POISXесли надо быстро, то чистый sh сильно противопоказан.
А из тулсов - самый подходяший - tr ... вот только multibyte он не понимает :(
Можно конечно попробовать изврат - iconv UTF8->KOI8R | tr ...Лучше налабай на сях или жабе. Я кстати буквально на днях видел на Go ~30 строк)
>>> Поехали...
>> На sed вот так, но чёй-то долго...
> А как же:
>>>>Только bash, по возможности POISX
> если надо быстро, то чистый sh сильно противопоказан.
> А из тулсов - самый подходяший - tr ... вот только multibyte
> он не понимает :(а нахрен тут мульт - два набора по 30 символов (грубо - из постановки задачи)? свою таблицу и все - скармливай ее.
> Можно конечно попробовать изврат - iconv UTF8->KOI8R | tr ...
> Лучше налабай на сях или жабе. Я кстати буквально на днях видел
> на Go ~30 строк)
>> А из тулсов - самый подходяший - tr ... вот только multibyte он не понимает :(
> а нахрен тут мульт - два набора по 30 символов (грубо -
> из постановки задачи)? свою таблицу и все - скармливай ее.Аааа .... дык ты не в теме! UTF8 - потому что! :)
echo "АБЫРВАЛГ-oh, that Russians" | hd -cb
И померкуй что к чему. Или сразу чего Павлинукс просил. Хрен-редьки ... :)
>>> А из тулсов - самый подходяший - tr ... вот только multibyte он не понимает :(
>> а нахрен тут мульт - два набора по 30 символов (грубо -
>> из постановки задачи)? свою таблицу и все - скармливай ее.
> Аааа .... дык ты не в теме! UTF8 - потому что! :)Не в теме конечно. Никогда про UTF не слышал...
> echo "АБЫРВАЛГ-oh, that Russians" | hd -cb
> И померкуй что к чему. Или сразу чего Павлинукс просил. Хрен-редьки ...
> :)померкуй про iconv,recode,enconv и найди для каждой утили по паре причин в чем каждая POSIX не соответствует, а потом уж свое echo разевай.
PS
условия читай: нет ни слова про UTF - значит нет для меня этой проблемы (как факт) при разработке кода и методов решения задачи.
>[оверквотинг удален]
> -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, по возможности 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, по возможности 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)
>
> ---приведенное начало кода - это необходимое условие решения задачи? именно ч/з ЭТО решать? )
> Поехали...
>[оверквотинг удален]
>>
>> #!/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 (ксэкеп) можно!
> НЮХ на H|-0Х не заменять! :) ХАКЕР -> XAKEP (ксэкеп) можно!Я давал повод к такому обращению?
>[оверквотинг удален]
>>> 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 для решения задачи занчения имеют? Если да, то уточните задачу.
> Из постов выше вопрос возникает: исходная и конечная CP для решения задачи
> занчения имеют? Если да, то уточните задачу.Пиши в любой, для кодировок есть iconv;
>> Пиши в любой, для кодировок есть iconv;
> Вы в самом деле придурки или просто пост №3 не читали?Спасибо. Не зачёт! Приходите летом на перездачу.
В задаче есть все необходмые условия.
>[оверквотинг удален]
> Только 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]
А вы и не найдейтесь, ответов небудет. Я не ЕГЭээээээ
> Задача: Заменить в тексте все буквы русского алфавита на схожие по-написанию латинские.есть утилитка replace из поставки Mysql ...
REPLACE(1) MySQL Database System REPLACE(1)
> Задача: Заменить в тексте все буквы русского алфавита на схожие по-написанию латинские.
> Только bash, по возможности POISX, те начинаться со строки.
> Поехали...Три месяца прошло. Вот, смотрю тема пользуется популярностью, придумал :-D пол-решения для написания tr на _чистом_ bash-е:
$ echo 123 |while read -N 1 char; do echo "$((++i)): >>$char<<"; done
1: >>1<<
2: >>2<<
3: >>3<<
4: >>
<<
$ _
> $ _Башизм%) всё-таки, но "дополнительные балы за --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
$ _
> Задача: Заменить в тексте все буквы русского алфавита на схожие по-написанию латинские.#!/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
>> Задача: Заменить в тексте все буквы русского алфавита на схожие по-написанию латинские.
> #!/bin/bash --posix
> echo -n "$CHAR"[ "$CHAR" ] && echo -n "$CHAR" || echo
Там же наверху _видно_, что с bash --posix _перевод строки_ нужно отдельно камлать.
>>> Задача: Заменить в тексте все буквы русского алфавита на схожие по-написанию латинские.
>> #!/bin/bash --posix
>> echo -n "$CHAR"
> [ "$CHAR" ] && echo -n "$CHAR" || echo
> Там же наверху _видно_, что с bash --posix _перевод строки_ нужно отдельно
> камлать.Не понял, что Вы имели ввиду. Указанный мною код работает.
>>>> Задача: Заменить в тексте все буквы русского алфавита на схожие по-написанию латинские.
>>> #!/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 тему жодно закрыть.
> $ 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''
>>> Задача: Заменить в тексте все буквы русского алфавита на схожие по-написанию латинские.
>> #!/bin/bash --posix
>> echo -n "$CHAR"
> [ "$CHAR" ] && echo -n "$CHAR" || echo
> Там же наверху _видно_, что с bash --posix _перевод строки_ нужно отдельно
> камлать.Да, я не посмотрел как будет с переводом строк. С данной конструкцией работает как надо.
#!/bin/bash --posixwhile 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
> С данной конструкцией работает как надо.Ваще жопа, проц на 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
> Поехали...Тестовый текст: Война и Мир (4 тома, UTF-8)
http://pavlinux.ru/VNM.txt.lzma (5.328.556 байт текста).
Контрольные суммы
Оргинал:$ md5sum VNM.txt
398d07d2988d50f8f9875790761cdb7d VNM.txtВыходной:
$ md5sum OUT.txt
31ed88cff54827fa178922edc194200e OUT.txt
#!/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 сек. дольше.
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
doneDue to conflicting historical implementations of the echo command, POSIX®
recommends that printf is preferred over echo.
Молодец - дожал таки! :-)
Павлинкс - только один вопрос: а зачем оно?
Ну только чесно, я чёйто как извилину не напрягаю для серьёзного чего применения не вижу ... Ы?
> 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...
Чисто для поднятия ЧСВ. Если использовать iconv, то можно обойтись и без этого кода на bash. Есть кодировка, в которой уже указанная в задании подмена сделана. :) На старых машинах типа ЕС ЭВМ использовалась. ;)
Но это не POSIX.
ну это уже 2-а прохода по тексту. или циклическая обработка веса каждого символа за один проход (что думаю по производительности на интерпритаторе будет хуже). тут в реале тестировать надо - экономия времени выйдет (на эти 15 секунд) за дополнительный проход по тексту или нет.
> ну это уже 2-а прохода по тексту. или циклическая обработка веса каждого
> символа за один проход (что думаю по производительности на интерпритаторе будет
> хуже). тут в реале тестировать надо - экономия времени выйдет (на
> эти 15 секунд) за дополнительный проход по тексту или нет.кстати у Хаффмана был алгоритм сжатия, который основывался как раз на анализе частоты встечающихся в тексте сиволов. потом наиболе частые символы кодировались короткой битовой последовательностью, а самые редкие наиболее длинной. Двухпроходной алгоритм (анализ и составение словаря, потом кодирование=сжатие) я как-то давным давно делал, но вроде как есть реализации и за один проход (опять же думаю, что для интерпритатора это мало подойдет по скорости). но попробуй алгоритмы погуглить... кто знает... мне кажется это наиболее близко к твоей задаче.
>> ну это уже 2-а прохода по тексту. или циклическая обработка веса каждого
>> символа за один проход (что думаю по производительности на интерпритаторе будет
>> хуже). тут в реале тестировать надо - экономия времени выйдет (на
>> эти 15 секунд) за дополнительный проход по тексту или нет.
> кстати у Хаффмана был алгоритм сжатияКстати, да. Павлин, выкидываешь из естественного ресского текста буквы е-о-а и получаешь сжатие процентов на... 5? и текст остаётся читаемым. Ну, то есть теми, кто Тьюринга прошёл.
>[оверквотинг удален]
>> хуже). тут в реале тестировать надо - экономия времени выйдет (на
>> эти 15 секунд) за дополнительный проход по тексту или нет.
> кстати у Хаффмана был алгоритм сжатия, который основывался как раз на анализе
> частоты встечающихся в тексте сиволов. потом наиболе частые символы кодировались короткой
> битовой последовательностью, а самые редкие наиболее длинной. Двухпроходной алгоритм
> (анализ и составение словаря, потом кодирование=сжатие) я как-то давным давно делал,
> но вроде как есть реализации и за один проход (опять же
> думаю, что для интерпритатора это мало подойдет по скорости). но попробуй
> алгоритмы погуглить... кто знает... мне кажется это наиболее близко к твоей
> задаче.Однопроходный алгоритм очень простой. Там частота использования символов задана заранее, а не вычисляется по текущему тексту. Частота использования символов уже посчитана лингвистами и криптографами достаточно давно и практически для всех современных языков. Погугли.
>[оверквотинг удален]
>>> эти 15 секунд) за дополнительный проход по тексту или нет.
>> кстати у Хаффмана был алгоритм сжатия, который основывался как раз на анализе
>> частоты встечающихся в тексте сиволов. потом наиболе частые символы кодировались короткой
>> битовой последовательностью, а самые редкие наиболее длинной. Двухпроходной алгоритм
>> (анализ и составение словаря, потом кодирование=сжатие) я как-то давным давно делал,
>> но вроде как есть реализации и за один проход (опять же
>> думаю, что для интерпритатора это мало подойдет по скорости). но попробуй
>> алгоритмы погуглить... кто знает... мне кажется это наиболее близко к твоей
>> задаче.
> Однопроходный алгоритм очень простой. Там частота использования символов задана заранее,средняя статистика.
> а не вычисляется по текущему тексту. Частота использования символов уже посчитана
в алгоритме сжатия Хаффмана - именно высчитывается. и как я уже говорил для наиболее частого символа выбирается наиболее короткая последовательность битов для кодирования, для наиболее редкого - самая дляинная. причем битовые коды для каждого символа подбираются таким образом, чтобы вся результирующа последовательность битов однозначно определяла каждый симовл. т.е не может быть кода 01 для буквы А (которая чаще всего всречается - просто пример) и кода 01* для буквы Я (которая встречается реже всего в тексте). а так - да статистика рулит. еще лет 25-ть назад, когда на ключе стучал - было че-то там СЕНОХРЕНВСПОМНЮ - именно наиболее встречающиеся буквы... )
> лингвистами и криптографами достаточно давно и практически для всех современных языков.
> Погугли.если есть конкретный неизменяемый текст, то по производительности в любом случае лучше создать собственный словарь частоты вхождения симолов - это придется сделать всего один раз и временные затраты тут не критичны совсем. полсе просто транслировать используюя данный словарь.
>> Однопроходный алгоритм очень простой. Там частота использования символов задана заранее,понял что Вы хотели сказать. стормозил чуть-чуть.. и распекался практически о том же).
>>[оверквотинг удален]
> Частота использования символов уже посчитана лингвистами и криптографами
> достаточно давно и практически для всех современных языков.Переделанная версия, с учётом частотности букв. 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
doneecho
E-e-e-e, от 4 до 9 сек. профита! :)
time cat VnM.txt | /work/recode2.sh > /dev/null
real 1m43.708s
user 1m31.108s
sys 0m12.323s
>>>[оверквотинг удален]
> 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
doneecho
time cat VNM.txt | ./recode5.sh > /dev/null
real 1m34.038s
user 1m20.380s
sys 0m13.405s
>> 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
> while read -r -N 1 char
> do
> case $char inВот тебе _самый_ частотный %) фикс:
\ ) echo -n ' ';;
> [[:lower:]])
И да, похоже, фигня с не-bash-ами не прокатит... :/
> Вот тебе _самый_ частотный %) фикс:
> \ ) echo -n ' ';;И самый-самый:
[^оеарсухОЕАНТРСВКМХ]) printf "%s" "$char";;
//да-да, echo -n, посикс...
> И самый-самый:
> [^оеарсухОЕАНТРСВКМХ]) 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
doneecho
#!/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
doneecho
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
#!/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
donereal 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
А можно на гитхаб? А то сложно diff'ы искать :)
> А можно на гитхаб? А то сложно diff'ы искать :)По времени :)
---
https://github.com/pavlinux/rus2lat.sh
> Аццкий разогн!!! Ж=-)
> real 1m4.994sНу, ты упорный. //Бенчмарк не автоматизировал ещё? Не быть тебе форониксом.
> while read -n 1024512 -r line
И кста, чего не $((100*1000*1000)) или др.?
> do
> while read -r -N 1 chari=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"---БенчИ-давай?!
>> 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
---
> Ужасно тормознутая версия, видимо у баша проблемы с операциями выборки из массива.real 22m29.780s
user 22m23.740s
sys 0m1.871s:)
$ 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
>[оверквотинг удален]
> OSYMS="oeapcyxOEAHTPCBKMX"
> # char=${BASH_REMATCH[2]}
> # case $char in
> # о) ochr=o;;
> # [...]
> # esac
> val="${SYMS%$char*}"
> ochr="${OSYMS:${#val}:1}"
> ou="$ou$ochr"
> ---БенчИ-давай?!Чё ты тут нахреначил??? Давай нормальный скрипт, читаемый и форматированный.
А чо всё молчали??? :D
cat file.txt | sed 'y/АВЕКМНОРСТХаеорсух/ABEKMHOPCTXaeopcyx/';