ALT Linux Community general discussions
 help / color / mirror / Atom feed
* [Comm] Значение переменной в awk
@ 2005-06-14  3:27 php-coder
  2005-06-14  4:55 ` Yura Kalinichenko
  2005-06-14  5:21 ` Pavel Usischev
  0 siblings, 2 replies; 3+ messages in thread
From: php-coder @ 2005-06-14  3:27 UTC (permalink / raw)
  To: community


    Подскажите пожалуйста, как подставить значение переменной в
    awk-выражение.

    Есть следующая комманда:

    awk '{if(NR>30&&NR<47){if($1>10){$1++;print $0}else{print $0}}else{print $0}}' Translation.m

    Но мне нужно, чтобы условие в нем было не постоянным, как сейчас, а
    чтобы вмечто 30 и 47 подставлялись числа.

    BEGIN=`awk '/set 3/{print NR+2}' Translation.m`
    END=`awk '/set 4/{print NR-2}' Translation.m`

    А вот подставить не получается:

    [c0der@mycomp ~]$ awk '{if(`echo -n "NR>"$BEGIN"&&NR<"$END`){if($1>10){$1++;print $0}else{print
    $0}}else{print $0}}' Translation.m 
    awk: {if(`echo -n "NR>"$BEGIN"&&NR<"$END`){if($1>10){$1++;print
    $0}else{print $0}}else{print $0}}
    awk:     ^ invalid char '`' in expression
    [c1der@mycomp ~]$

    Прошу помощи.

    Если надо, то могу объяснить задачу:
    есть файл формата:

    $set 1

    1 bla
    2 bla-bla
    3 bla-bla-bla

    $set 2

    1 blaa
    2 blaa-blaa
    3 blaa-blaa

    Таких секций в нем много. Мне нужно в третью секцию вставить еще одну
    строчку. Да так чтобы все последующие за ней увеличились на единицу.
    И это нужно только в одной секции подправить. Т.е. Было:

    $set 3

    1 one
    2 two
    ...
    9 nine
    10 ten
    ...
    
    $set 4

    А должно стать:

    $set 3

    1 one
    2 two
    ...
    9 NEW!
    10 nine
    11 ten
    ...
    
    $set 4

    Вот. Такая вот задачка :) Не хочется ради нее писать что-либо на
    Перле или Питоне. Хочется в одну строчку ;) В одну строчку-то сделал,
    да вот не могу теперь сделать, чтобы этим однострочником кучу файлов
    обработать.

    Благодарю за помощь!

-- 
+ php-coder
+ php-coder[at]altlinux[dot]ru





^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [Comm] Значение переменной в awk
  2005-06-14  3:27 [Comm] Значение переменной в awk php-coder
@ 2005-06-14  4:55 ` Yura Kalinichenko
  2005-06-14  5:21 ` Pavel Usischev
  1 sibling, 0 replies; 3+ messages in thread
From: Yura Kalinichenko @ 2005-06-14  4:55 UTC (permalink / raw)
  To: AltLinux Community Maillist

В Вто, 14/06/2005 в 10:27 +0700, php-coder пишет:
>     Подскажите пожалуйста, как подставить значение переменной в
>     awk-выражение.
> 
>     Есть следующая комманда:
> 
>     awk '{if(NR>30&&NR<47){if($1>10){$1++;print $0}else{print $0}}else{print $0}}' Translation.m
> 
>     Но мне нужно, чтобы условие в нем было не постоянным, как сейчас, а
>     чтобы вмечто 30 и 47 подставлялись числа.
> 
>     BEGIN=`awk '/set 3/{print NR+2}' Translation.m`
>     END=`awk '/set 4/{print NR-2}' Translation.m`
> 
>     А вот подставить не получается:
> 
>     [c0der@mycomp ~]$ awk '{if(`echo -n "NR>"$BEGIN"&&NR<"$END`){if($1>10){$1++;print $0}else{print
>     $0}}else{print $0}}' Translation.m 
>     awk: {if(`echo -n "NR>"$BEGIN"&&NR<"$END`){if($1>10){$1++;print
>     $0}else{print $0}}else{print $0}}
>     awk:     ^ invalid char '`' in expression
>     [c1der@mycomp ~]$

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

1. Не используйте в качестве имен переменных идентификаторв BEGIN и END
- это зарезервированные слова.

2. При подстановке непозиционных переменных не надо перед их именами
писать знак $

3. Не надо вставлять в текст awk-программы команды shell - это
совершенно разные вещи.

3. Присвоение значения переменной выполняется просто с помощью оператора
присваивания:

- в командной строке - инициализация

awk '{printf "min=%d; max=%d\n",MIN,MAX}' MIN=30 MAX=47 file.ext

- в теле программы внутри блока BEGIN - инициализация 

awk 'BEGIN { MIN=30 ; MAX=47 } ; { printf "min=%d; max=%d\n",MIN,MAX}' file.ext

- в теле программы - динамическое изменение

awk 'BEGIN { MIN=30 ; MAX=47 } ; { printf "min=%d; max=%d\n",MIN,MAX ; MIN=MIN+1 ; MAX=MAX+1}' file.ext

-- 
Yura Kalinichenko




^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [Comm] Значение переменной в awk
  2005-06-14  3:27 [Comm] Значение переменной в awk php-coder
  2005-06-14  4:55 ` Yura Kalinichenko
@ 2005-06-14  5:21 ` Pavel Usischev
  1 sibling, 0 replies; 3+ messages in thread
From: Pavel Usischev @ 2005-06-14  5:21 UTC (permalink / raw)
  To: community

php-coder пишет:
>     Подскажите пожалуйста, как подставить значение переменной в
>     awk-выражение.

>     BEGIN=`awk '/set 3/{print NR+2}' Translation.m`
>     END=`awk '/set 4/{print NR-2}' Translation.m`

Вот эти, если экспортировать, будут видны в awk-программе через 
ENVIRON["BEGIN"] и ENVIRON["END"].

Другой вариант:

awk -v startnum=$BEGIN -v endnum=$END ' . . . '

Переменные startnum и endnum будут доступны в программе. С именами BEGIN 
и END будьте аккуратнее, в awk-программе это обозначения блоков кода, 
как переменную использовать не получится.

Третий вариант:

awk 'BEGIN {print '$BEGIN'}'

То есть использование переменной выносить за одинарные кавычки, в 
которых раскрытия переменных в (известных мне) shell не происходит.

-- 
С уважением,
Павел Усищев

-- 
С уважением,
Павел Усищев


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2005-06-14  5:21 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-06-14  3:27 [Comm] Значение переменной в awk php-coder
2005-06-14  4:55 ` Yura Kalinichenko
2005-06-14  5:21 ` Pavel Usischev

ALT Linux Community general discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/community/0 community/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 community community/ http://lore.altlinux.org/community \
		mandrake-russian@linuxteam.iplabs.ru community@lists.altlinux.org community@lists.altlinux.ru community@lists.altlinux.com
	public-inbox-index community

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.community


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git