про awk и shell-2 (вопрос с нуля)

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Reiser
рядовой
Сообщения: 22
Зарегистрирован: 2010-04-21 17:28:07

про awk и shell-2 (вопрос с нуля)

Непрочитанное сообщение Reiser » 2010-05-17 2:57:03

Есть один файлик, на который натравливается аwk и при выполнении строкой всяких хитрых условий выводятся некие поля этой строки.
Необходимо: при удовлетворении выше описанных условий, кроме некоторых полей вывести также из другого файла, адрес которого определяется через поле $x, строку с номером $y, где $y - также некое поле в первом файле.
файл1.txt -> awk -> $x и $y -> $x.txt -> awk 'if NR==$y' -> результат (строку) вывести, приконкатенировав её к выводу первого awk
Какой должен быть вывод - понятно?

Хостинговая компания 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/

Reiser
рядовой
Сообщения: 22
Зарегистрирован: 2010-04-21 17:28:07

Re: про awk и shell-2 (вопрос с нуля)

Непрочитанное сообщение Reiser » 2010-05-17 6:42:00

Собственно, вопрос решился:
1.sh:

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

i=foo
j=bar

awk  '{
print "test", "'`2.sh $i $j`'"
}' 1.txt
2.sh:

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

awk '{
printf NR $1
}' conservation/$1/$2/consurf.grades
Единственная проблема - NR и $1 получаются конкатенированны, любая попытка вставить пробел (" ") оканчивается ругательством в 1.sh. Как вставить?

Reiser
рядовой
Сообщения: 22
Зарегистрирован: 2010-04-21 17:28:07

Re: про awk и shell-2 (вопрос с нуля)

Непрочитанное сообщение Reiser » 2010-05-17 7:20:32

Вопрос про передачу переменных внутри awk:

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

z=ABC

awk '{
z=$1;
print "'`echo $z`'"
}'
упорно даёт ABC, а не $1. Как передать позиционный параметр внутрь??

Гость
проходил мимо

Re: про awk и shell-2 (вопрос с нуля)

Непрочитанное сообщение Гость » 2010-05-17 13:58:25

Reiser писал(а):Единственная проблема - NR и $1 получаются конкатенированны, любая попытка вставить пробел (" ") оканчивается ругательством в 1.sh. Как вставить?
добавь двойные кавычки вокруг обратных

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

"`2.sh...`"
и лучше замени обратные кавычки `...` на $(...), их легче заметить и отличить от обычных одинарных кавычек '...'

ps, твои примеры не работают без напильника: используй BEGIN { blah...} вместо 1.txt и conservation/$1/$2/consurf.grades

Гость
проходил мимо

Re: про awk и shell-2 (вопрос с нуля)

Непрочитанное сообщение Гость » 2010-05-17 14:13:13

Reiser писал(а):упорно даёт ABC, а не $1. Как передать позиционный параметр внутрь??
никак, раскрытие строки (см. command substitution в sh(1)) происходит раньше, чем исполнение awk. А также переменные awk сами по себе не наследуются sh, так и наоборот. IIRC, в sh(1) переменные наследуются только в command substitution, при использовании export и внутри функций. К тому же в awk переменные окружения наследуются внутрь массива ENVIRON, чтобы не мешать собственным.

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

$ awk 'BEGIN { print ENVIRON["HOME"] }'
/home/blah

Гость
проходил мимо

Re: про awk и shell-2 (вопрос с нуля)

Непрочитанное сообщение Гость » 2010-05-17 14:16:01

более удачный пример

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

$ export z=ABC
$ awk 'BEGIN { print z }'

$ awk 'BEGIN { print ENVIRON["z"] }'
ABC

vlad0201
проходил мимо
Сообщения: 1
Зарегистрирован: 2010-07-08 15:50:09

Re: про awk и shell-2 (вопрос с нуля)

Непрочитанное сообщение vlad0201 » 2010-07-08 16:00:36

Есть проблема! есть dbf и я его конвертирую в тхт, в этом dbfесть поле, и мне нужно из поля вырезать ненужные мне символы и переставить их в начало поля. Уже все мозги выкипели! HELP!!!!!!!