我的脚本看起来像这样
#!/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中打印之前创建的名为“basen”的变量。 但不知怎的,它没能按照我希望的那样做。
因此,例如myfile.txt
包含这些行
foo bar bax
foo qux bar
使用上面的bash脚本我希望得到
myfile bax
myfile bar
这样做的正确方法是什么?
答案 0 :(得分:29)
-v
标志用于从命令行设置变量。尝试这样的事情:
awk -v "BASEN=$basen" '{print BASEN "\t" $3}'
答案 1 :(得分:12)
你可以这样使用它。
for i in `find $1 -name \*.jar`
do
jar tvf $i| awk -F '/' '/class/{print "'${i}'" " " $NF }' >> $classFile
done
你应该使用
在AWK中“ '$ {I}'”
使用
$ I
在Bash Script中创建。
答案 2 :(得分:4)
你可以在awk中做所有事情
awk '{gsub(".txt","",ARGV[1]);print ARGV[1] "\t" $3}' inputfile.txt
答案 3 :(得分:4)
假设你运行awk 作为shell的子进程,你声明了vars
在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中读取值:无论
注意导出的重要性。在它外面,考虑来自shell的变量 本地的,并没有传递给协同进程。
答案 4 :(得分:2)
原因是bash变量(环境变量)不会在单引号字符串中展开。尝试替换
'{print $basen "\t" $3}'
与
"{print \"$basen\" \"\t\" \$3}"
答案 5 :(得分:1)
最简单的方法是创建一个awk变量。 awk -v awkvar=$bashvar 'awkscript'
。