awk
può eseguire awk
funzioni. Affinché bash
funzioni, dovresti awk
eseguire una bash
shell, quella bash
per interpretare la definizione di quella funzione, e chiamare quella funzione, con il valore estratto da awk
passato come argomenti.
Non banale.
bash
supporta l'esportazione di funzioni, quindi è disponibile nelle successive invocazioni di bash
, quindi è un modo per passare la definizione della funzione a quella bash
invocata da awk
:
export -f d2h
Gli unici modi per awk
eseguire un comando ( bash
qui) sono con il suo system("cmd")
, o print... | "cmd"
o "cmd" | getline
. In tutti i casi, awk
corre un guscio di interpretare che cmd
, ma sarà sh
, no bash
. Quindi è necessario costruire una riga di comando per sh
quella è bash
un'invocazione che interpreta una bash
riga di comando per invocare la funzione, quindi è necessario fare attenzione con la citazione:
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))}'
Ciò significa che eseguire uno sh
e uno bash
per ogni riga, quindi sarà abbastanza inefficiente. Ciò finirebbe per essere significativamente più inefficiente rispetto a dover bash
leggere e dividere con un while read loop
:
(unset IFS; while read -r a b rest; do
printf '%s\n' "$a"
d2h "$b"
done < file)
d2h
fosse un eseguibile, ma non se si tratta di una "funzione definita in .bashrc o in shell script".