awk
puede ejecutar awk
funciones. Para que ejecute bash
funciones, necesitaría awk
ejecutar un bash
shell, que bash
interprete la definición de esa función, y llame a esa función, con el valor extraído por awk
pasado como argumentos.
No es trivial
bash
admite 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 bash
invocada por awk
:
export -f d2h
Las únicas formas de awk
ejecutar un comando ( bash
aquí) son con su system("cmd")
, o print... | "cmd"
o "cmd" | getline
. En todos los casos, awk
ejecuta un shell para interpretar eso cmd
, pero será sh
, nobash
. Por lo tanto, debe construir una línea de comando para sh
eso es una bash
invocación que interpreta una bash
lí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 sh
y uno bash
para cada línea, por lo que será bastante ineficiente. Eso terminaría siendo incluso significativamente más ineficiente que tener bash
que leer y dividir con while read loop
:
(unset IFS; while read -r a b rest; do
printf '%s\n' "$a"
d2h "$b"
done < file)
d2h
fuera un ejecutable, pero no si es una "función definida en .bashrc o en script de shell".