Переменная Bash внутри awk

Для xfce4 эта работа :"killall -USR1 xfce4 -appfinder"

0
26.09.2020, 15:09
3 ответа

Вы могли бы, если бы вам действительно, очень нужно было (, но, пожалуйста, прочтите комментарий Эда ), напишите скрипт-обертку, который считывал бы файл с переменными и добавлял их как -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массив.

1
18.03.2021, 23:02

Похоже, вы просто думаете об этом неправильно, и все, что у вас есть, это файл из 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, демонстрирующий, что вы пытаетесь сделать.

2
18.03.2021, 23:02

Предполагая, что ваш файл 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иначе ).

1
18.03.2021, 23:02

Теги

Похожие вопросы