Страница 1 из 1

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

Добавлено: 2008-07-21 22:27:15
Vadim
Хотел передать авку ip-адрес в скрипте и обалдел от такого закидона.
Простейший пример странного поведения:

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

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

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

Добавлено: 2008-07-21 22:42:49
Alex Keda
чё-то я слабо понимаю чё ты вообще пытался сделать этой конструкцией...
сдаётся мне, что авк тоже не понимает... поэтому и выводит то к чему душа лежит.

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

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

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

Добавлено: 2008-07-22 0:23:25
Alex Keda
поделись

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

Добавлено: 2008-07-22 6:45:58
Vadim
lissyara писал(а):поделись
Леххко:

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

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

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

Добавлено: 2008-07-22 7:55:29
zg
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 и многое станет проще

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

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

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

upd
Да, так тоже можно... Если заранее нужные переменные из шелла в авковские передавать :oops:

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

Добавлено: 2008-07-22 8:58:22
zg
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

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

Добавлено: 2008-07-22 9:02:28
Vadim
zg писал(а):
Vadim писал(а):А они не самоценны.
толи я такой тупой, то ли ты такой умный 8)
Толи не поняли друг друга :)

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

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

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

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

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

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

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

Добавлено: 2008-07-22 11:54:17
zg
Vadim писал(а):Пока не могу определить, какой способ быстрее.
на кой тебе это? шелл никогда не отличался быстротой, нужна скорость - пиши на C.

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

Добавлено: 2008-07-24 1:41:58
eZH
Вот тут стало всё очевидно:
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)

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

Добавлено: 2008-07-24 12:07:04
zg
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#