it-swarm.com.de

Parameter an eine awk-Skriptdatei übergeben

Wie kann ich einen Parameter an eine awk-Skriptdatei übergeben?

#!/usr/bin/awk -f

{print $1}

Hier möchte ich das erste Argument ausgeben, das von der Shell an das Skript übergeben wurde:

bash-Prompt> echo "test" | ./myawkscript.awk hello
bash-Prompt> hello
29
Mahmoud Emam

ihr Hash-Knall definiert, dass das Skript kein Shell-Skript ist, sondern ein awk-Skript. Sie können es nicht in bash Weise in Ihrem Skript tun.

außerdem haben Sie Folgendes getan: echo blah|awk ... ist nicht Übergeben eines Parameters. Es leitet die Ausgabe des Befehls echo an einen anderen Befehl weiter.

sie können es wie folgt versuchen:

 echo "hello"|./foo.awk file -

oder

var="hello"
awk -v a="$var" -f foo.awk file

damit hast du var a in deiner foo.awk, du könntest es benutzen.

wenn Sie so etwas wie ein Shell-Skript machen möchten, das $ 1 $ 2 Vars akzeptiert, können Sie ein kleines Shellskript schreiben, um Ihre awk-Sachen zu verpacken.

EDIT

Nein, ich habe dich nicht falsch verstanden.

nehmen wir das Beispiel:

nehmen wir an, Ihr x.awk hat:

{print $1}

wenn Sie tun :

echo "foo" | x.awk file

es ist dasselbe wie:

echo "foo"| awk '{print $1}' file

hier ist die Eingabe für awk nur file, dein Echo foo macht keinen Sinn. wenn Sie tun:

  echo "foo"|awk '{print $1}' file -
or
    echo "foo"|awk '{print $1}' - file

awk nimmt zwei Eingaben entgegen (Argumente für awk), eine ist stdin, eine ist die Datei, in Ihrem awk-Skript könnten Sie:

echo "foo"|awk 'NR==FNR{print $1;next}{print $1}' - file

dies wird zuerst foo von Ihrem Echo aus drucken, dann macht die Spalte1 von file in diesem Beispiel natürlich nichts, sondern druckt sie alle aus.

sie können natürlich mehr als zwei Eingänge haben und die NR und die FNR nicht überprüfen, Sie könnten die verwenden

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

zum Beispiel :

echo "foo"|./x.awk file1 - file2

dann ist dein "foo" das 2. Argument, du kannst es in deinem x.awk durch ARGV[2] bekommen

echo "foo" |x.awk file1 file2 file2 -

jetzt ist es ARGV Fall.

Ich meine, Ihr echo "foo"|.. Wäre stdin für awk, es könnte durch 1. oder n. "Argument"/Eingabe für awk erfolgen. hängt davon ab, wo Sie den - (stdin) eingeben. Sie müssen damit in Ihrem awk-Skript umgehen.

15
Kent

In awk$1 verweist auf das erste Feld in einem Datensatz und nicht auf das erste Argument wie in bash. Sie müssen hierfür ARGV verwenden, überprüfen Sie hier für das offizielle Wort.

Skript:

#!/bin/awk -f

BEGIN{
    print "AWK Script"
    print ARGV[1]
}

Demo:

$ ./script.awk "Passed in using ARGV"
AWK Script
Passed in using ARGV
52
Chris Seymour

Sie können -v als Befehlszeilenoption um eine Variable für das Skript bereitzustellen:

Angenommen, wir haben eine Datei script.awk wie folgt:

BEGIN {print "I got the var:", my_var}

Dann führen wir es so aus:

$ awk -v my_var="hello this is me" -f script.awk
I got the var: hello this is me
25
fedorqui