Реализации awk и функция length

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Реализации awk и функция length

Сообщение Nazyvaemykh »

Вроде как, в man 1p awk написано:
length[([s])]
Return the length, in characters, of its argument taken as a
string, or of the whole record, $0, if there is no argument.

Не в байтах, в символах.

При этом разные реализации выдают разные значения. Я сравнил gawk, mawk и awk из набора plan9-утилит, портированных на Linux (не говорю GNU\Linux, потому что эти программы какбы замещают собой GNU?) 9base, вот что получилось:

$ gawk 'BEGIN {print length("ы")}'
1
$ /opt/plan9/bin/awk 'BEGIN {print length("ы")}'
2
$ mawk 'BEGIN {print length("ы")}'
2
По некоторым сведениям, в самом plan9 awk выдает единицу.

Возможно, mawk просто вызывает strlen для length?
Всякие багзиллы, исходники еще не смотрел, ночь уже.. А может быть, кто из линуксоидов знает, насколько тут допустимо выводить разные значения, ошибка ли это или просто особенность поведения?
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: Реализации awk и функция length

Сообщение /dev/random »

Не знаю, как насчёт plan9 awk, а mawk тупо не поддерживает юникод. Со всеми вытекающими.
Спасибо сказали:
Аватара пользователя
taaroa
Сообщения: 1319

Re: Реализации awk и функция length

Сообщение taaroa »

Nazyvaemykh писал(а):
01.05.2011 02:07
Я сравнил gawk, mawk и awk из набора plan9-утилит, портированных на Linux (не говорю GNU\Linux, потому что эти программы какбы замещают собой GNU?) 9base, вот что получилось

в openbsd-4.7 ещё попробуйте.
(Stefan Sperling) писал(а):локаль UTF-8 не должна использоваться в окружениях, требующих высокого уровня стабильности


http://www.digibarn.com/collections/screen...tar-8010-06.jpg
:wq
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Реализации awk и функция length

Сообщение sash-kan »

Nazyvaemykh писал(а):
01.05.2011 02:07
портированных на Linux (не говорю GNU\Linux, потому что эти программы какбы замещают собой GNU?)

$ ldd /opt/plan9/bin/awk
?
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Реализации awk и функция length

Сообщение drBatty »

Nazyvaemykh писал(а):
01.05.2011 02:07
А может быть, кто из линуксоидов знает, насколько тут допустимо выводить разные значения, ошибка ли это или просто особенность поведения?

особенность.
Before sending a bug report, please do the following things. First,
verify that you have the latest version of gawk. Many bugs (usually
subtle ones) are fixed at each release, and if yours is out of date,
the problem may already have been solved. Second, please see if set‐
ting the environment variable LC_ALL to LC_ALL=C causes things to
behave as you expect. If so, it's a locale issue, and may or may not
really be a bug. Finally, please read this man page and the reference
manual carefully to be sure that what you think is a bug really is,
instead of just a quirk in the language.

поставьте LC_ALL=C, и ваш остолоп станет нормально работать ;)

пруф

$

$ gawk 'BEGIN {print length("ы")}' 1 $ LC_ALL=C gawk 'BEGIN {print length("ы")}' 2

http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 3170
ОС: Gentoo

Re: Реализации awk и функция length

Сообщение ormorph »

drBatty писал(а):
01.05.2011 13:14
поставьте LC_ALL=C, и ваш остолоп станет нормально работать ;)

пруф

$

$ gawk 'BEGIN {print length("ы")}' 1 $ LC_ALL=C gawk 'BEGIN {print length("ы")}' 2



Хм это называется нормально работать?
если выдает число букв в строке вместо одной две))
тогда чтобы получить реальный ответ придется делить на 2

$

$ echo $[`LC_ALL=C gawk 'BEGIN {print length("ыы")}'`/2] 2

Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Реализации awk и функция length

Сообщение drBatty »

ormorph писал(а):
01.05.2011 13:38
Хм это называется нормально работать?
если выдает число букв в строке вместо одной две))

потому, что ы == ДВА символа в POSIX локали. А то, что у меня показывает 1, это не баг, а фича. Фича остолопа. В мане сказано, что эта фича специально сделана для не-англичан, т.е. для нас с вами ;)
ormorph писал(а):
01.05.2011 13:38
тогда чтобы получить реальный ответ придется делить на 2

не нужно. ибо 尻 это один символ, и gawk в курсе

$

gawk 'BEGIN {print length("尻")}' 1

http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 3170
ОС: Gentoo

Re: Реализации awk и функция length

Сообщение ormorph »

drBatty писал(а):
01.05.2011 14:00
ormorph писал(а):
01.05.2011 13:38
Хм это называется нормально работать?
если выдает число букв в строке вместо одной две))

потому, что ы == ДВА символа в POSIX локали. А то, что у меня показывает 1, это не баг, а фича. Фича остолопа. В мане сказано, что эта фича специально сделана для не-англичан, т.е. для нас с вами ;)
ormorph писал(а):
01.05.2011 13:38
тогда чтобы получить реальный ответ придется делить на 2

не нужно. ибо 尻 это один символ, и gawk в курсе

$

gawk 'BEGIN {print length("尻")}' 1




Про то и имел в виду, что в данном случае лучше всего использовать gawk
ЗЫ: локаль пусть уж останется та же.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Реализации awk и функция length

Сообщение drBatty »

ormorph писал(а):
01.05.2011 14:23
Про то и имел в виду, что в данном случае лучше всего использовать gawk
ЗЫ: локаль пусть уж останется та же.

но - gawk с юникодом == опасность. потому-то системные скрипты работают в POSIX-локали, и об этом надо помнить - что ручками запускаешь - всё работает, а когда само - не работает.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 3170
ОС: Gentoo

Re: Реализации awk и функция length

Сообщение ormorph »

drBatty писал(а):
01.05.2011 14:59
но - gawk с юникодом == опасность. потому-то системные скрипты работают в POSIX-локали, и об этом надо помнить - что ручками запускаешь - всё работает, а когда само - не работает.

Думаю все зависит для чего используешь, для системных скриптов вообще лучше использовать латиницу, тогда и локаль не играет особой роли.
Спасибо сказали:
Ginzburg
Сообщения: 37
ОС: Windows Vista

Re: Реализации awk и функция length

Сообщение Ginzburg »

mawk -v LANG=$LANG 'function lenc(x){ x="echo -n \"" x "\" | env LANG="LANG" wc -m "; x | getline x; return x;} BEGIN { print lenc("ы") }'
Я конечно далек от мысли... (с)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Реализации awk и функция length

Сообщение drBatty »

ormorph писал(а):
01.05.2011 15:08
для системных скриптов вообще лучше использовать латиницу, тогда и локаль не играет особой роли.

беда в том, что злоумышленник может подсунуть скрипту (который имеет права рута) текст по-русски. Ну например может попробовать применить неправильно команду, которую ему запрещено выполнять. Об этом будет естественно запись в логе, который будет просматривать скрипт. Скрипт споткнётся на неправильном символе, и может выполнить команду злоумышленника. В POSIX-локали "неправильных" символов нет, по определению. А в UTF - есть.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Ginzburg
Сообщения: 37
ОС: Windows Vista

Re: Реализации awk и функция length

Сообщение Ginzburg »

а как поступать с доменом рф ?
Я конечно далек от мысли... (с)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Реализации awk и функция length

Сообщение drBatty »

Ginzburg писал(а):
03.05.2011 16:14
а как поступать с доменом рф ?

никак.

ЗЫЖ а что с доменом? ну будет в нём в 2 раза больше "букв", какая разница-то? скрипту размер и порядок сортировки обычно не слишком важен. Вы-же храните на диски файлы с русскими именами? Вот. А для ФС - это просто байты. Просто вам это не показано.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Ginzburg
Сообщения: 37
ОС: Windows Vista

Re: Реализации awk и функция length

Сообщение Ginzburg »

а как быть с

президент.рф
почта.рф

системный скрипт хочет знать скока в них буков - как быть ?
Я конечно далек от мысли... (с)
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Реализации awk и функция length

Сообщение sash-kan »

Ginzburg писал(а):
03.05.2011 17:43
а как быть с

президент.рф
почта.рф

системный скрипт хочет знать скока в них буков - как быть ?
26 и 22 соответственно:
$ idn --quiet -a президент.рф | wc -c
26
$ idn --quiet -a почта.рф | wc -c
22
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Ginzburg
Сообщения: 37
ОС: Windows Vista

Re: Реализации awk и функция length

Сообщение Ginzburg »

о чем и речь в сабже
Я конечно далек от мысли... (с)
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Реализации awk и функция length

Сообщение Nazyvaemykh »

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

Ужас!
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Реализации awk и функция length

Сообщение drBatty »

Ginzburg писал(а):
03.05.2011 17:43
системный скрипт хочет знать скока в них буков - как быть ?

вопрос ЗАЧЕМ?
ну будет для него Ф == 2 буквы, вам-то какая разница?
Nazyvaemykh писал(а):
03.05.2011 19:40
что «ы» — две буквы, так оно когда-то и было, но большинство других букв русского языка.
Ужас!

никто не мешает вам всё перевести в родную cp866 ;)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Реализации awk и функция length

Сообщение Nazyvaemykh »

Разве cp866 поддерживает все символы европейских языков? про другие пока не спрашиваю.
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Реализации awk и функция length

Сообщение sash-kan »

Nazyvaemykh писал(а):
03.05.2011 19:40
Какая это все-таки ужасная система
ну, не используйте plan9 (равно как и обрубки от неё). в чём проблема?

p.s. конечно, я не согласен с вашим мнением по поводу plan9.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Реализации awk и функция length

Сообщение watashiwa_daredeska »

drBatty писал(а):
03.05.2011 20:18
никто не мешает вам всё перевести в родную cp866
и одновременно в не менее родную cp1251, и в UTF-16 до кучи. Хотя нет, в UTF-16 вообще почти все буквы двухбайтовые, да еще мерзкий BOM в начале файла — тоже не кузяво… А так всё красиво на первый взгляд, эх-х…

Nazyvaemykh писал(а):
03.05.2011 20:23
Разве cp866 поддерживает все символы европейских языков?
А какая, кроме Unicode, поддерживает? Или русский — уже не европейский?
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Реализации awk и функция length

Сообщение sash-kan »

[парафраз на один известный прогноз]одного байта хватит всем алфавитам[/парафраз]
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Реализации awk и функция length

Сообщение Nazyvaemykh »

watashiwa_darede..., вот и я удивляюсь, как можно рекомендовать кому-то cp866 вместо utf-8. И как можно утверждать, что «А» — это две буквы, а не одна. Меня разыгрывают, да?

¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Реализации awk и функция length

Сообщение watashiwa_daredeska »

Nazyvaemykh писал(а):
03.05.2011 20:30
И как можно утверждать, что «А» — это две буквы, а не одна.
Кто сказал? «А» — одна буква. В зависимости от многих разных условий и кодировок, может кодироваться весьма разным количеством битов. Где написано, что обязательно должно быть байт==буква? Ткните носом, пожалуйста.

Ginzburg писал(а):
03.05.2011 17:43
системный скрипт хочет знать скока в них буков - как быть ?
Устанавливать в нем LANG вручную, не?
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Реализации awk и функция length

Сообщение Nazyvaemykh »

watashiwa_darede..., в первом сообщении этой темы приводится выдержка из man 1p awk, где говорится, что вроде как length возращает длину строки в символах. А не в байтах.
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Реализации awk и функция length

Сообщение watashiwa_daredeska »

drBatty писал(а):
03.05.2011 16:11
Скрипт споткнётся на неправильном символе, и может выполнить команду злоумышленника.
Эт смотря какой скрипт. Есть простое правило — не исполняй то, что пришло не из доверенного источника.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Реализации awk и функция length

Сообщение sash-kan »

Nazyvaemykh писал(а):
01.05.2011 02:07
ошибка ли это или просто особенность поведения?
кривое портирование, imho.

plan9 как таковая понимает, что существуют разные charmap-ы?
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Реализации awk и функция length

Сообщение watashiwa_daredeska »

Nazyvaemykh писал(а):
03.05.2011 20:37
в первом сообщении этой темы приводится выдержка из man 1p awk, где говорится
mawk — полуброшенная софтина, до многобайтовых кодировок у них еще руки не дошли.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Реализации awk и функция length

Сообщение drBatty »

Nazyvaemykh писал(а):
03.05.2011 20:23
Разве cp866 поддерживает все символы европейских языков? про другие пока не спрашиваю.

drBatty писал(а):
03.05.2011 20:18
вам-то какая разница?

какая разница скрипту? кодировка важна только в двух случаях:
1) при определении размера одной буквы. Зачем это скрипту? Зачем это вообще системной программе? Это только для пользовательской важно, сколько в слове букв. А системной программе важно лишь количество байт.
2) для сортировки. Но опять-таки - для сортировки с т.з. человека. Вот ФС сортирует файлы по своему, для быстрого их поиска, вы это как-то замечаете? Наберите например
$ ls -lU ~
И что? Это отсортированный по мнению ФС ваш домашний каталог.

От юзерских представлений только вред, дыры, баги и тормоза.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: