Как заставить AWK использовать переменную, созданную в Bash Script

У меня есть script, который выглядит как

#!/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 script я надеюсь получить

myfile bax
myfile bar

Какой правильный способ сделать это?

Ответы

Ответ 1

Вы можете использовать его так.

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

Вы должны использовать

"'$ {я}'"

в AWK, чтобы использовать

создан в Bash Script.

Ответ 2

Флаг -v предназначен для установки переменных из командной строки. Попробуйте что-то вроде этого:

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

Ответ 3

вы можете просто сделать все в awk

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

Ответ 4

Предполагая, что вы запускаете 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: any

обратите внимание на важность экспорта. При этом считается, что вары из оболочки локальный и не переходит к совместным процессам.

Ответ 5

Причина в том, что переменные bash (переменные среды) не разворачиваются в однокасканных строках. Попробуйте заменить

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

с

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

Ответ 6

Самый простой способ - сделать awk-переменную. awk -v awkvar=$bashvar 'awkscript'.