Si je veux passer un paramètre à un fichier de script awk, comment faire?
#!/usr/bin/awk -f
{print $1}
Ici, je veux imprimer le premier argument passé au script à partir du shell, comme:
bash-Prompt> echo "test" | ./myawkscript.awk hello
bash-Prompt> hello
votre hash bang définit que le script n'est pas un script Shell, c'est un script awk. vous ne pouvez pas le faire de manière bash dans votre script.
aussi, ce que vous avez fait: echo blah|awk ...
est pas passant le paramètre, il redirige la sortie de la commande echo vers une autre commande.
vous pouvez essayer de cette façon ci-dessous:
echo "hello"|./foo.awk file -
ou
var="hello"
awk -v a="$var" -f foo.awk file
avec cela, vous avez var a
dans votre foo.awk, vous pouvez l'utiliser.
si vous voulez faire quelque chose comme le script Shell accepte $ 1 $ 2 vars, vous pouvez écrire un petit script shell pour envelopper vos trucs awk.
MODIFIER
Non, je ne vous ai pas mal compris.
prenons l'exemple:
disons, votre x.awk
a:
{print $1}
si tu fais :
echo "foo" | x.awk file
c'est la même chose que:
echo "foo"| awk '{print $1}' file
ici l'entrée pour awk est seulement file
, votre écho foo n'a pas de sens. si tu fais:
echo "foo"|awk '{print $1}' file -
or
echo "foo"|awk '{print $1}' - file
awk prend deux entrées (arguments pour awk) l'une est stdin l'autre est le fichier, dans votre script awk vous pourriez:
echo "foo"|awk 'NR==FNR{print $1;next}{print $1}' - file
cela imprimera d'abord foo
de votre écho, puis la colonne1 de file
bien sûr cet exemple ne fait rien de réel, il suffit de les imprimer tous.
vous pouvez bien sûr avoir plus de deux entrées, et ne pas vérifier le NR et le FNR, vous pouvez utiliser le
ARGC The number of elements in the ARGV array.
ARGV An array of command line arguments, excluding options and the program argument, numbered from zero to ARGC-1
par exemple :
echo "foo"|./x.awk file1 - file2
alors votre "foo" est le 2ème argument, vous pouvez l'obtenir dans votre x.awk par ARGV[2]
echo "foo" |x.awk file1 file2 file2 -
maintenant c'est ARGV [4].
Je veux dire, votre echo "foo"|..
serait stdin pour awk, il pourrait l'être par le 1er ou le nième "argument"/entrée pour awk. dépend de l'endroit où vous placez le -
(stdin). Vous devez le gérer dans votre script awk.
Dans awk
$1
fait référence au premier champ d'un enregistrement et non au premier argument comme dans bash
. Vous devez utiliser ARGV
pour cela, consultez ici pour le mot officiel.
Scénario:
#!/bin/awk -f
BEGIN{
print "AWK Script"
print ARGV[1]
}
Démo:
$ ./script.awk "Passed in using ARGV"
AWK Script
Passed in using ARGV
Vous pouvez utiliser -v
comme option de ligne de commande pour fournir une variable au script:
Disons que nous avons un fichier script.awk comme ceci:
BEGIN {print "I got the var:", my_var}
Ensuite, nous l'exécutons comme ceci:
$ awk -v my_var="hello this is me" -f script.awk
I got the var: hello this is me