awk의 Bash 변수

awk의 Bash 변수

ch.sh에 bash 변수가 많이 있습니다.

$ cat ch.sh
BBG=`tput setab 0`
RBG=`tput setab 1`
GBG=`tput setab 2`
.
.
.
$ cat abc
asd
bsd
csd
.
.
.

각 변수를 선언하지 않고 awk에서 액세스하고 싶습니다 awk -v. 어떤 방법이 있습니까? 나는 이것을 시도했다

source ch.sh
awk `
#Let s[asd]="B"
ta=s[$0] "BG" #s is awk array sowehow created by other file
#colour print of line in abc
` abc

몇 가지 방법을 제안해주세요.

답변1

이 오류가 발생했다고 생각하는 것 같은데 실제로 가지고 있는 것은 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

정말로 꼭 해야만 한다면 할 수 있습니다. (하지만 꼭 읽어주세요.에드의 코멘트), 변수가 있는 파일을 읽고 이를 -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배열로 읽어옵니다.

답변3

파일에 유효한 셸 변수 할당이 포함되어 있다고 가정하면 ch.sh이러한 변수를 환경으로 내보낸 다음 ENVIRON연관 배열을 사용하여 AWK 스크립트에서 참조할 수 있습니다.

이 내용을 감안할 때 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. 그렇지 않으면 사용할 수 없습니다.

관련 정보