* [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