web-dev-qa-db-fra.com

Passer le paramètre à un fichier de script awk

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
29
Mahmoud Emam

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.

15
Kent

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
52
Chris Seymour

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
25
fedorqui