Comment faire pour que AWK utilise la variable créée dans Bash Script

J’ai un script qui ressemble à ceci

#!/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. 

Ce que je veux faire ci-dessus est d’imprimer dans AWK la variable appelée ‘basen’ créée auparavant. Mais d’une manière ou d’une autre, il n’a pas réussi à faire ce que j’espérais.

Ainsi, par exemple, myfile.txt contient ces lignes

 foo bar bax foo qux bar 

Avec le script bash ci-dessus, j’espère obtenir

 myfile bax myfile bar 

Quelle est la bonne façon de le faire?

Vous pouvez l’utiliser comme ça.

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

Tu devrais utiliser

“‘$ {i}'”

dans AWK pour utiliser le

$ i

créé dans Bash Script.

L’ -v de définir des variables à partir de la ligne de commande. Essayez quelque chose comme ça:

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

vous pouvez juste tout faire dans awk

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

En supposant que vous exécutez awk comme sous-processus du shell, vous avez déclaré les vars
Dans la coquille

 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"]; }' 

Résultat:

Lecture des valeurs de awk: peu importe

remarquez l’importance de l’ exportation . Sans lui, les vars du shell sont considérés comme locaux et ne sont pas transmis aux co-processus.

La raison en est que les variables bash (variables d’environnement) ne sont pas développées dans des chaînes entre guillemets simples. Essayez de remplacer

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

avec

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

Le plus simple est de créer une variable awk. awk -v awkvar=$bashvar 'awkscript' .