awkpuede ejecutar awkfunciones. Para que ejecute bashfunciones, necesitaría awkejecutar un bashshell, que bashinterprete la definición de esa función, y llame a esa función, con el valor extraído por awkpasado como argumentos.
No es trivial
bashadmite la exportación de funciones, por lo que está disponible en invocaciones posteriores bash, por lo que esa es una forma de pasar la definición de la función a la bashinvocada por awk:
export -f d2h
Las únicas formas de awkejecutar un comando ( bashaquí) son con su system("cmd"), o print... | "cmd"o "cmd" | getline. En todos los casos, awkejecuta un shell para interpretar eso cmd, pero será sh, nobash . Por lo tanto, debe construir una línea de comando para sheso es una bashinvocación que interpreta una bashlínea de comando para invocar la función, por lo que debe tener cuidado al citar:
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))}'
Eso significa ejecutar uno shy uno bashpara cada línea, por lo que será bastante ineficiente. Eso terminaría siendo incluso significativamente más ineficiente que tener bashque leer y dividir con while read loop:
(unset IFS; while read -r a b rest; do
printf '%s\n' "$a"
d2h "$b"
done < file)
d2hfuera un ejecutable, pero no si es una "función definida en .bashrc o en script de shell".