awk Это у него бага или фича?

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
Vadim
мл. сержант
Сообщения: 145
Зарегистрирован: 2007-02-15 17:17:12

awk Это у него бага или фича?

Непрочитанное сообщение Vadim » 2008-07-21 22:27:15

Хотел передать авку ip-адрес в скрипте и обалдел от такого закидона.
Простейший пример странного поведения:

Код: Выделить всё

#!/bin/sh
a="1.2.30.4"
echo "bla-bla" | awk "{print $a}"
Ну зачем он выводит "1,20,30,4"? (да, запятые между цифрами, если локаль русская!) Почему он впендюривает ноль справа к промежуточным числам, но не впендюривает, если промежуточное число заканчивается на ноль?! И естественный вопрос - как с этим бороться?

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: awk Это у него бага или фича?

Непрочитанное сообщение Alex Keda » 2008-07-21 22:42:49

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

Аватара пользователя
Vadim
мл. сержант
Сообщения: 145
Зарегистрирован: 2007-02-15 17:17:12

Re: awk Это у него бага или фича?

Непрочитанное сообщение Vadim » 2008-07-21 23:40:56

lissyara писал(а):чё-то я слабо понимаю чё ты вообще пытался сделать этой конструкцией...
сдаётся мне, что авк тоже не понимает... поэтому и выводит то к чему душа лежит.
А чё тут непонятного? Я хотел, чтобы на выходе было "1.2.30.4" а не "1,20,30,4". Ну, главное было спросить, у меня всегда так - как кому умному вопрос задашь, так ответ сам находится. Разобрался уже. А до того никак простое решение не шло в голову. Переклинило.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: awk Это у него бага или фича?

Непрочитанное сообщение Alex Keda » 2008-07-22 0:23:25

поделись
Убей их всех! Бог потом рассортирует...

Аватара пользователя
Vadim
мл. сержант
Сообщения: 145
Зарегистрирован: 2007-02-15 17:17:12

Re: awk Это у него бага или фича?

Непрочитанное сообщение Vadim » 2008-07-22 6:45:58

lissyara писал(а):поделись
Леххко:

Код: Выделить всё

#!/bin/sh
a="1.2.30.4"
echo "bla-bla" | awk "{print \"$a\"}"
Но, блин, как уродуют текст эти экранированные кавычки! :evil:

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: awk Это у него бага или фича?

Непрочитанное сообщение zg » 2008-07-22 7:55:29

Vadim писал(а):Хотел передать авку ip-адрес в скрипте и обалдел от такого закидона.
а при чём тут awk?
достаточно добавить echo перед вызвом awk и будет показан вызов awk

Код: Выделить всё

zg# ./2.sh
awk {print 1.2.30.4}
zg#
как видишь, принт идёт без кавычек, при этом точка отделяет дробную часть от целого, что делает вторая точка, понятия не имею, но явно какие-то махинации с числовыми значениями

Код: Выделить всё

zg# awk 'BEGIN{print 1.2.222.2.2.2.2}'
1.20.2220.20.20.20.2
zg#
Vadim писал(а):Но, блин, как уродуют текст эти экранированные кавычки!
потому что это неправильный вариант :smile:

Код: Выделить всё

zg# awk -v a="1.2.3.4" 'BEGIN {print a}'
1.2.3.4
zg#
man awk и многое станет проще

Аватара пользователя
Vadim
мл. сержант
Сообщения: 145
Зарегистрирован: 2007-02-15 17:17:12

Re: awk Это у него бага или фича?

Непрочитанное сообщение Vadim » 2008-07-22 8:41:57

zg писал(а):достаточно добавить echo перед вызвом awk и будет показан вызов awk
Если бы было так просто!
как видишь, принт идёт без кавычек, при этом точка отделяет дробную часть от целого, что делает вторая точка, понятия не имею, но явно какие-то махинации с числовыми значениями
Мне тоже интересно, что они хотели этим сказать, но интерес уже чисто академический.

потому что это неправильный вариант :smile:
Это твой вариант неправильный. Нужно выводить не что-то заранее данное, в этом случае просто была бы строка, а параметр извне. Из шелловской переменной в данном случае. Двойные кавычки вместо апострофов вокруг фигурных скобок не зря поставлены. Ты же работаешь с внутренними переменным самого авка. А они не самоценны.

upd
Да, так тоже можно... Если заранее нужные переменные из шелла в авковские передавать :oops:
Последний раз редактировалось Vadim 2008-07-22 8:58:58, всего редактировалось 1 раз.

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: awk Это у него бага или фича?

Непрочитанное сообщение zg » 2008-07-22 8:58:22

Vadim писал(а):А они не самоценны.
толи я такой тупой, то ли ты такой умный 8)

Код: Выделить всё

NAME
       awk - pattern-directed scanning and processing language

SYNOPSIS
       awk [ -F fs ] [ -v var=value ] [ 'prog' | -f progfile ] [ file ...  ]
....
       ENVIRON
              array of environment variables; subscripts are names.
Vadim писал(а):Это твой вариант неправильный. Нужно выводить не что-то заранее данное, в этом случае просто была бы строка, а параметр извне.
:crazy: жизнь сложная штука, я бываю неправ 8 из 10 раз, и прекрасно об этом знаю. Сколько раз бываешь неправ ты?

Код: Выделить всё

zg# setenv A "Hello World!" && awk -v a="$A" 'BEGIN {print a}'
Hello World!
zg#
man sh
man csh
man awk

Аватара пользователя
Vadim
мл. сержант
Сообщения: 145
Зарегистрирован: 2007-02-15 17:17:12

Re: awk Это у него бага или фича?

Непрочитанное сообщение Vadim » 2008-07-22 9:02:28

zg писал(а):
Vadim писал(а):А они не самоценны.
толи я такой тупой, то ли ты такой умный 8)
Толи не поняли друг друга :)

Мой вариант-то тоже работает.
:crazy: жизнь сложная штука, я бываю неправ 8 из 10 раз, и прекрасно об этом знаю. Сколько раз бываешь неправ ты?
К моему постоянному удивлению, реже. Особенно, если учесть случаи, когда сам ошибки признаю :)

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: awk Это у него бага или фича?

Непрочитанное сообщение zg » 2008-07-22 9:19:27

Vadim писал(а):Мой вариант-то тоже работает.
ты из шела коструируешь статичный скрипт авк, но при этом думаешь, что передаёшь авк переменную. Переменную в авк можно передать либо из коммандной строки через -v var=value, либо через глобальную переменную окружения, используя массив ENVIRON, других способов нет. А сконструировать статичный скрипт можно как угодно, хоть шелл, хоть не шелл.

Аватара пользователя
Vadim
мл. сержант
Сообщения: 145
Зарегистрирован: 2007-02-15 17:17:12

Re: awk Это у него бага или фича?

Непрочитанное сообщение Vadim » 2008-07-22 9:52:46

zg писал(а):
Vadim писал(а):Мой вариант-то тоже работает.
ты из шела коструируешь статичный скрипт авк, но при этом думаешь, что передаёшь авк переменную.
Не, не думаю, как оно работает, я понимаю. Просто не все такие умные, как авк, что могут собственные переменные вводить перед запуском и вне основного тела скрипта. Вот по привычке и делаю статику. Шелл, он весь на этом стоит.

Пока не могу определить, какой способ быстрее. Прогоны на большом массиве дают результаты с разницей в переделах погрешности измерений.

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: awk Это у него бага или фича?

Непрочитанное сообщение zg » 2008-07-22 11:54:17

Vadim писал(а):Пока не могу определить, какой способ быстрее.
на кой тебе это? шелл никогда не отличался быстротой, нужна скорость - пиши на C.

eZH
проходил мимо

Re: awk Это у него бага или фича?

Непрочитанное сообщение eZH » 2008-07-24 1:41:58

Вот тут стало всё очевидно:
zg# awk 'BEGIN{print 1.2.222.2.2.2.2}'
1.20.2220.20.20.20.2
zg#
Авк воспринимает первое число до точки (1) как целую часть дроби, после точки (2) как дробную часть, потом число (1,2) кончилось и началось следующее число с опущенной целой частью (.222) в локали опущеная часть представляется как 0 вот и получается 0,222 и потом ещё 0,2 и 0,2 и 0,2 и наконец 0,2

8)

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: awk Это у него бага или фича?

Непрочитанное сообщение zg » 2008-07-24 12:07:04

eZH писал(а):кончилось и началось следующее число с опущенной целой частью (.222)
ты чертовски прав :smile:

Код: Выделить всё

zg# awk 'BEGIN{print 1.2 .3}'
1,20,3
zg# awk 'BEGIN{print 1.2, .3}'
1,2 0,3
zg#