web-dev-qa-db-ja.com

Bashスクリプトで作成された変数をAWKに使用させる方法

私はこのようなスクリプトを持っています

#!/bin/bash
#exampel inputfile is "myfile.txt"
inputfile=$1
basen=`basename $inputfile .txt`  # create basename

cat $inputfile | 
awk '{print $basen "\t" $3}  # this doesn't print "myfile" but the whole content of it.

上でやりたいのは、前に作成した「basen」という変数をAWKで出力することです。しかし、どういうわけか、私が望んでいたことを実行できませんでした。

したがって、たとえばmyfile.txtこれらの行を含む

foo bar bax
foo qux bar

上記のbashスクリプトで私は取得したいと思っています

myfile bax
myfile bar

それを行う正しい方法は何ですか?

16
neversaint

このように使えます。

for i in `find $1 -name \*.jar`
do
jar tvf $i| awk -F '/' '/class/{print "'${i}'" " " $NF }' >> $classFile
done

あなたは使用する必要があります

"'$ {i}'"

aWKで使用するには

$ i

bashスクリプトで作成されました。

12
iamxhu

-vフラグは、コマンドラインから変数を設定するためのものです。次のようなものを試してください。

awk -v "BASEN=$basen" '{print BASEN "\t" $3}'
29
drawnonward

あなたはawkですべてを行うことができます

awk '{gsub(".txt","",ARGV[1]);print ARGV[1] "\t" $3}' inputfile.txt
4
ghostdog74

Awkを実行すると仮定しますシェルのサブプロセスとしてvarsを宣言しました
シェル内

export MY_VARS="whatever"; #// IT NEEDS to be exported, to allow the sub process awk read access.
echo ""| awk '{
    print "Reading values from within awk : "ENVIRON["MY_VARS"];
}'

結果:

Awk内から値を読み取る:何でも

exportの重要性に注意してください。それがないと、シェルからの変数はローカルと見なされ、コプロセスに渡されません。

4
GreenFox

その理由は、bash変数(環境変数)が一重引用符で囲まれた文字列内で展開されないためです。交換してみてください

'{print $basen "\t" $3}'

"{print \"$basen\" \"\t\" \$3}"
2
David Z

最も簡単な方法は、awk変数を作成することです。 awk -v awkvar=$bashvar 'awkscript'

1
Daenyth