Ist es irgendwie möglich, die Bash-Funktion in AWK zu verwenden?
Beispieldatei (String, Int, Int, Int)
Mike 247808 247809 247810
Es wurde versucht, Werte von dezimal in hexadezimal zu konvertieren.
Funktion, die entweder in .bashrc oder im Shell-Skript definiert ist.
awk '{print $1 ; d2h($2)}' file
awk: Aufrufen der undefinierten Funktion d2h Eingabe Datensatznummer 1, Datei Datei Quelle Zeilennummer 1
d2h
es sich um eine ausführbare Datei handelt, aber nicht, wenn es sich um eine "in .bashrc oder in Shell-Skript definierte Funktion" handelt.source
) zu verwenden, kann jedoch nicht herausfinden, warum dies nicht funktioniert.bashrc
.$2
letztendlich als Shell-Code interpretiert wird.Sie können bash von awk aus aufrufen und dessen Ausgabe verwenden. Das ist aus Performance-Sicht natürlich gefährlich, wenn es zu oft vorkommt. Zitieren der Manpage:
Befehl wäre ein Bash-Skript, das die Funktionsdefinition enthält und die Funktion ausführt.
quelle
Versuchen Sie Folgendes:
AFAIK, Sie können in awk keine Bash-Funktion verwenden, sondern nur ein Skript. Bei Bedarf können Sie eine awk-Funktion verwenden.
quelle
Verwenden einer benutzerdefinierten Bash-Funktion in awk
Haftungsausschluss: Mir ist klar, dass dies nicht das ist, was das OP versucht, aber Google wird andere wie mich zu dieser Antwort führen.
Lage
Sie haben ein
bash
Skript, das mit Funktionen organisiert ist (weil Sie sich selbst oder [die meisten] Kollegen nicht hassen) und mindestens eine dieser Funktionen muss eine andere von innen aufrufenawk
.Lösung
Skript
Ausgabe
quelle
awk
awk
Funktionen ausführen können. Damitbash
Funktionen ausgeführt werden können, müssen Sieawk
einebash
Shell ausführen , diebash
die Definition dieser Funktion interpretiert und diese Funktion mit dem vonawk
übergeben als Argumenten extrahierten Wert aufruft .Nicht trivial.
bash
unterstützt das Exportieren von Funktionen, damit diese in nachfolgenden Aufrufen von verfügbar sind. Auf diesebash
Weise können Sie die Definition der Funktion an diebash
aufgerufenen übergebenawk
:Die einzigen Möglichkeiten
awk
, einen Befehl (bash
hier) auszuführen, sind mitsystem("cmd")
, oderprint... | "cmd"
oder"cmd" | getline
. In allen Fällenawk
läuft eine Shell, um das zu interpretieren,cmd
wird es abersh
nicht seinbash
. Sie müssen also eine Befehlszeile erstellensh
, die einenbash
Aufruf darstellt, der einebash
Befehlszeile zum Aufrufen der Funktion interpretiert. Daher müssen Sie vorsichtig sein, wenn Sie Folgendes angeben:Das bedeutet, dass für jede Zeile eine
sh
und eine ausgeführt werdenbash
muss, was ziemlich ineffizient sein wird. Das wäre sogar noch ineffizienter alsbash
das Lesen und Teilen mitwhile read loop
:quelle
Dies gibt Ihnen gute Chancen.
Mit der Systemfunktion können Sie den bash-Befehl in awk stream analysieren.
quelle
Nur ein kurzer Hack demonstriert @HaukeLaging
command|getline
:1) lass die Eingabe sein:
In der Eingabe folgt die Shell-Syntax:
wird verwendet, um zu bezeichnen Inline-Befehle , die durch das Ergebnis seiner Ausführung ersetzt werden sollen.
2) Wir können den Inline-Shell-Befehl folgendermaßen erweitern:
3) Verwendung (nach dem üblichen chmod):
quelle