¿Es posible usar la función bash dentro de AWK de alguna manera?
Archivo de ejemplo (string, int, int, int)
Mike 247808 247809 247810
Intentando convertir valores de decimal a hexadecimal.
Función definida en .bashrc o en script de shell.
awk '{print $1 ; d2h($2)}' file
awk: llamar a la función indefinida d2h entrada número de registro 1, número de línea de origen del archivo de archivo 1

d2hfuera un ejecutable, pero no si es una "función definida en .bashrc o en script de shell".source), pero no puedo entender por qué no funciona.bashrc.$2termina siendo interpretado como código shell.Puede llamar a bash desde awk y usar su salida. Obviamente, eso es peligroso desde una perspectiva de rendimiento si sucede con demasiada frecuencia. Citando la página del manual:
El comando sería un script bash que contiene la definición de la función y ejecuta la función.
fuente
Intenta hacer esto:
AFAIK, no puedes usar una función bash en awk sino solo un script. Puede usar una función awk si es necesario.
fuente
Usar una función bash definida por el usuario dentro de awk
Renuncia: me doy cuenta de que esto no es lo que el OP está tratando de hacer, pero Google llevará a otros como yo a esta respuesta.
Situación
Tiene un
bashscript que está organizado con funciones (porque no se odia a sí mismo ni a [la mayoría] de los compañeros de trabajo) y al menos 1 de esas funciones necesita llamar a otra desde dentroawk.Solución
Guión
Salida
fuente
awkpuede ejecutarawkfunciones. Para que ejecutebashfunciones, necesitaríaawkejecutar unbashshell, quebashinterprete la definición de esa función, y llame a esa función, con el valor extraído porawkpasado como argumentos.No es trivial
bashadmite la exportación de funciones, por lo que está disponible en invocaciones posterioresbash, por lo que esa es una forma de pasar la definición de la función a labashinvocada porawk:Las únicas formas de
awkejecutar un comando (bashaquí) son con susystem("cmd"), oprint... | "cmd"o"cmd" | getline. En todos los casos,awkejecuta un shell para interpretar esocmd, pero serásh, nobash. Por lo tanto, debe construir una línea de comando parasheso es unabashinvocación que interpreta unabashlínea de comando para invocar la función, por lo que debe tener cuidado al citar:Eso significa ejecutar uno
shy unobashpara cada línea, por lo que será bastante ineficiente. Eso terminaría siendo incluso significativamente más ineficiente que tenerbashque leer y dividir conwhile read loop:fuente
Esto te dará buenas oportunidades.
La función del sistema le permite analizar el comando bash dentro de la secuencia awk.
fuente
Solo un truco rápido demuestra @HaukeLaging
command|getline:1) deje que la entrada sea:
Siguiendo la sintaxis de shell, en la entrada,
se usa para denotar comandos en línea para ser reemplazados por el resultado de su ejecución.
2) Podemos expandir el comando de shell en línea mediante:
3) Uso (después del chmod habitual):
fuente