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
. 그렇지 않으면 사용할 수 없습니다.