¿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
d2h
fuera 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
.$2
termina 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
bash
script 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
awk
puede ejecutarawk
funciones. Para que ejecutebash
funciones, necesitaríaawk
ejecutar unbash
shell, quebash
interprete la definición de esa función, y llame a esa función, con el valor extraído porawk
pasado como argumentos.No es trivial
bash
admite 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 labash
invocada porawk
:Las únicas formas de
awk
ejecutar un comando (bash
aquí) son con susystem("cmd")
, oprint... | "cmd"
o"cmd" | getline
. En todos los casos,awk
ejecuta un shell para interpretar esocmd
, pero serásh
, nobash
. Por lo tanto, debe construir una línea de comando parash
eso es unabash
invocación que interpreta unabash
línea de comando para invocar la función, por lo que debe tener cuidado al citar:Eso significa ejecutar uno
sh
y unobash
para cada línea, por lo que será bastante ineficiente. Eso terminaría siendo incluso significativamente más ineficiente que tenerbash
que 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