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'
.