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 

たとえば、次の2つのファイルがあるとします。

$ 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。それ以外の場合は使用できません。

関連情報