Вы могли бы, если бы вам действительно, очень нужно было (, но, пожалуйста, прочтите комментарий Эда ), напишите скрипт-обертку, который считывал бы файл с переменными и добавлял их как -v
опции:
#/bin/bash
## The first argument is the file with the variables
varFile=$1
## Remove the first argument from the $@ array
shift;
## read the file and add the variables as -v declarations
while IFS="=" read -r var value; do
varString=$varString" -v $var=${value} "
done < "$varFile"
## Run awk, with the -v declarations and whatever you
## gave on the command line.
awk $varString "$@"
Если вы сохраните этот скрипт как runAwk.sh
в папке $PATH
и сделаете его исполняемым (chmod a+x /home/auth/bin/runAwk.sh
), вы сможете запустить:
runAwk.sh variables.txt 'awk command' data
Например, учитывая эти два файла:
$ cat variables.txt
var1=bob
var2=foo
var3=baz
$ cat data
1 2
3 4
5 6
Вы можете бежать:
$ foo.sh variables.txt '{print var1,var2,var3,$2;}' data
bob foo baz 2
bob foo baz 4
bob foo baz 6
ВАЖНО:это не удастся, если в ваших значениях переменных есть пробелы или другие пробелы. Например, он не может справиться с этим:
var1='something with spaces'
Если вам действительно нужно иметь дело с такими значениями, вам следует переосмыслить свой подход и не пытаться смешивать языки. Или, если вы не можете, используйте хитрый прием Эда Мортона и считывайте переменные в исходный awk
массив.
Похоже, вы просто думаете об этом неправильно, и все, что у вас есть, это файл из tag="value"
пар в ch.sh
, так что попробуйте это:
$ echo 7 |
awk '
NR==FNR {
tag = val = $0
sub(/[[:space:]]*=.*/,"",tag)
gsub(/^[^=]+=[[:space:]]*"?|"?[[:space:]]*$/,"",val)
ch[tag] = val
next
}
{
tag = "var2"
print ch[tag], $0
}
' ch.sh -
zsd 7
и если это не все, что вам нужно, отредактируйте свой вопрос, предоставив минимальный пример кода bash+awk, демонстрирующий, что вы пытаетесь сделать.
Предполагая, что ваш файл ch.sh
содержит действительные назначения переменных оболочки, вы можете экспортировать эти переменные в среду, а затем ссылаться на них в своем сценарии AWK, используя ассоциативный массив ENVIRON
.
Учитывая это содержание дляabc
:
asd
bsd
csd
и этот контент дляch.sh
:
BBG=`tput setab 0`
RBG=`tput setab 1`
GBG=`tput setab 2`
чисто иллюстративным сценарием Bash может быть:
set -a
../ch.sh
set +a
awk '
BEGIN {
s["abc"] = "B"
s["bsd"] = "G"
s["csd"] = "R"
}
{
ta = ENVIRON[s[$0] "BG"]
printf("%s%s%s%s", ta, $0, ENVIRON["BBG"], ORS)
}
' abc
set -a
указывает оболочке пометить все вновь созданные или измененные переменные для экспорта (они были бы недоступны для awk
иначе ).