我有看起来像这样的脚本
#!/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.
上面我想做的是在AWK中打印出之前创build的名为“basen”的variables。 但不知怎的,它做不到我所希望的。
所以例如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 作为shell的子进程,你声明了变量
在壳内
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中读取值:无论如何
注意出口的重要性。 除此之外,来自外壳的变量被认为是本地的,不会被传递到协同处理。
原因是bash变量(环境变量)不在单引号字符串中扩展。 尝试更换
'{print $basen "\t" $3}'
同
"{print \"$basen\" \"\t\" \$3}"
最简单的方法是做一个awk变量。 awk -v awkvar=$bashvar 'awkscript'
。