awkawkFunktionen ausführen können. Damit bashFunktionen ausgeführt werden können, müssen Sie awkeine bashShell ausführen , die bashdie Definition dieser Funktion interpretiert und diese Funktion mit dem von awkübergeben als Argumenten extrahierten Wert aufruft .
Nicht trivial.
bashunterstützt das Exportieren von Funktionen, damit diese in nachfolgenden Aufrufen von verfügbar sind. Auf diese bashWeise können Sie die Definition der Funktion an die bashaufgerufenen übergeben awk:
export -f d2h
Die einzigen Möglichkeiten awk, einen Befehl ( bashhier) auszuführen, sind mit system("cmd"), oder print... | "cmd"oder "cmd" | getline. In allen Fällen awkläuft eine Shell, um das zu interpretieren, cmdwird es aber shnicht sein bash. Sie müssen also eine Befehlszeile erstellen sh, die einen bashAufruf darstellt, der eine bashBefehlszeile zum Aufrufen der Funktion interpretiert. Daher müssen Sie vorsichtig sein, wenn Sie Folgendes angeben:
export -f d2h
<file awk -v q="'" '
function shquote(s) {
gsub(q, q "\\" q q, s)
return q s q
}
{print $1; system("bash -c '\''d2h \"$1\"'\'' bash " shquote($2))}'
Das bedeutet, dass für jede Zeile eine shund eine ausgeführt werden bashmuss, was ziemlich ineffizient sein wird. Das wäre sogar noch ineffizienter als bashdas Lesen und Teilen mit while read loop:
(unset IFS; while read -r a b rest; do
printf '%s\n' "$a"
d2h "$b"
done < file)
d2hes sich um eine ausführbare Datei handelt, aber nicht, wenn es sich um eine "in .bashrc oder in Shell-Skript definierte Funktion" handelt.