私はこのようなスクリプトを持っています
#!/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
それを行う正しい方法は何ですか?
このように使えます。
for i in `find $1 -name \*.jar`
do
jar tvf $i| awk -F '/' '/class/{print "'${i}'" " " $NF }' >> $classFile
done
あなたは使用する必要があります
"'$ {i}'"
aWKで使用するには
$ i
bashスクリプトで作成されました。
-v
フラグは、コマンドラインから変数を設定するためのものです。次のようなものを試してください。
awk -v "BASEN=$basen" '{print BASEN "\t" $3}'
あなたはawkですべてを行うことができます
awk '{gsub(".txt","",ARGV[1]);print ARGV[1] "\t" $3}' inputfile.txt
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の重要性に注意してください。それがないと、シェルからの変数はローカルと見なされ、コプロセスに渡されません。
その理由は、bash変数(環境変数)が一重引用符で囲まれた文字列内で展開されないためです。交換してみてください
'{print $basen "\t" $3}'
と
"{print \"$basen\" \"\t\" \$3}"
最も簡単な方法は、awk変数を作成することです。 awk -v awkvar=$bashvar 'awkscript'
。