2014-10-17 1 views
0

Я использую awkc для создания исполняемого файла из awk-скрипта. У меня есть следующие строки в качестве abc.awk AWK сценария:Как установить lang env на «en_US.UTF-8» в awk-скрипте?

BEGIN{printf "Value=%s\n",(3.13+3.26)} 

Я сгенерировал исполняемый файл (abc.exe), который я произведу на различных системах. Он дает разные выходы в операциях с плавающей запятой.

В одной локальной системе он дает выход 6.39, но дает выход 6 другой системе, расположенным в другом часовом поясе.

Когда я искал на разных сайтах, я могу видеть, чтобы установить переменную окружения LANG, но как?

+0

Является ли эта часть скрипта awk? Должно ли это быть 'printf'? Можете ли вы воспроизвести проблему с минимальным примером 'awk 'BEGIN {printf" Value =% s \ n ", (3.13 + 3.26)}''? –

+0

Я кратко объяснил ваше предложение. Чтобы добавить, я создал exe со следующей командой: awkc -o -f Vamshi

+0

Возможно, вы захотите взглянуть на этот вопрос: http://stackoverflow.com/questions/18946689/why-does-awk-refuse-to -sum-up-floats –

ответ

0

Я не уверен, что это связано с настройками локали в разных системах, но если вы ищете число с плавающей запятой, вы должны использовать спецификатор формата "%f". Для того, чтобы получить ответ на 2-х знаков после запятой, используйте "%.2f":

BEGIN{printf "Value=%.2f\n",(3.13+3.26)} 

Это должно дать тот же результат, независимо от системы, он работает на.

Edit: на основе связанного вопроса, возможно, вы должны попробовать использовать LC_NUMERIC=C явно установить локаль:

LC_NUMERIC=C awk 'BEGIN{printf "Value=%.2f\n",(3.13+3.26)}' 

должны работать независимо от системы она выполняется на.

+0

Я пробовал с "%.2f ", но результат равен« Value = 6,00 » . Я думаю о запятой, а не в результате. Я думаю, что есть некоторая зависимость от локали. Не так ли? – Vamshi

+0

Итак, если вы попробуете' 3,13+ 3,26' на этой системе, я думаю, это работает? –

+0

Он не работает, поскольку exe не генерируется из-за неправильного формата. Но мне нужно какое-то решение, которое является общим для всех систем. На самом деле, мое требование - для динамических значений, которые на самом деле хранятся в некоторых переменных.Таким образом, отладки я нашел проблему с float.Так что с разных сайтов я нашел, чтобы установить locale LC_ALL или LC_NUMERIC на какое-то значение, которое обрабатывает числовые выражения. Но не объяснил, как использовать его в скрипте. – Vamshi

0

Переменные среды обычно являются тем, что вы не контролируете, если передаете программу кому-то еще. Я бы стал более конкретным в ваших printf -calls. Вы можете отформатировать номера в строки до удивительной детали. Вы, вероятно, ищете float (%f) (вы сейчас используете string (%s).

Если вы заметили, что вы делаете всегда один и тот же трюк с printf -calls, вы можете контролировать номер-to . параметры преобразования строки с в Бегин-блока переменной CONVFMT я познакомился с этим один через gawk, по-видимому, это, однако, в стандарте POSIX поддерживает ли awkc это, я не знаю

с gawk manual..:

Эта строка управляет преобразованием чисел в строки (см. Конверсия). Он работает, будучи переданным, по сути, как первый аргумент функции sprintf() (см. Строковые функции). Значение по умолчанию - «% .6g». CONVFMT был представлен стандартом POSIX.

 Смежные вопросы

  • Нет связанных вопросов^_^