Est-il possible d'utiliser la fonction bash dans AWK d'une manière ou d'une autre?
Exemple de fichier (chaîne, int, int, int)
Mike 247808 247809 247810
Essayer de convertir des valeurs décimales en hexadécimales.
Fonction définie soit en .bashrc soit en script shell.
awk '{print $1 ; d2h($2)}' file
awk: appel de la fonction non définie d2h entrée numéro d'enregistrement 1, fichier fichier source ligne numéro 1
d2h
s'agissait d'un exécutable, mais pas s'il s'agit d'une "fonction définie soit en .bashrc soit en script shell".source
) mais je ne peux pas comprendre pourquoi cela ne fonctionne pas.bashrc
.$2
finit par être interprété comme du code shell.Vous pouvez appeler bash depuis awk et utiliser sa sortie. C'est évidemment dangereux du point de vue des performances si cela se produit trop souvent. Citant la page de manuel:
serait un script bash qui contient la définition de la fonction et exécute la fonction.
la source
Essayez de faire ceci:
AFAIK, vous ne pouvez pas utiliser une fonction bash dans awk mais seulement un script. Vous pouvez utiliser une fonction awk si nécessaire.
la source
Utilisation d'une fonction bash définie par l'utilisateur dans awk
Avertissement: je me rends compte que ce n'est pas ce que le PO essaie de faire, mais Google mènera d'autres personnes comme moi à cette réponse.
Situation
Vous avez un
bash
script qui est organisé avec des fonctions (parce que vous ne vous détestez pas ou [la plupart] des collègues) et au moins une de ces fonctions doit en appeler une autre de l'intérieurawk
.Solution
Scénario
Sortie
la source
awk
peut exécuter desawk
fonctions. Pour qu'il exécute desbash
fonctions, vous devezawk
exécuter unbash
shell, celuibash
d'interpréter la définition de cette fonction, et appeler cette fonction, avec la valeur extraite parawk
passé comme arguments.Pas anodin.
bash
prend en charge l'exportation de fonctions, il est donc disponible dans les invocations ultérieures debash
, c'est donc une façon de transmettre la définition de la fonction à l'bash
appelé parawk
:Les seules façons
awk
d'exécuter une commande (bash
ici) sont avec sonsystem("cmd")
, ouprint... | "cmd"
ou"cmd" | getline
. Dans tous les cas,awk
exécute un shell pour interpréter celacmd
, mais ce ne serash
pas le casbash
. Vous devez donc construire une ligne de commande carsh
c'est unebash
invocation qui interprète unebash
ligne de commande pour appeler la fonction, vous devez donc être prudent en citant:Cela signifie en exécuter un
sh
et unbash
pour chaque ligne, donc ça va être assez inefficace. Cela finirait par être encore plus inefficace que debash
faire la lecture et le fractionnement avec unwhile read loop
:la source
Cela vous donnera de bonnes chances.
la fonction système vous permet d'analyser la commande bash dans un flux awk.
la source
Juste un petit hack démontre @HaukeLaging
command|getline
:1) que l'entrée soit:
En suivant la syntaxe du shell, en entrée,
est utilisé pour désigner les commandes en ligne à remplacer par le résultat de son exécution.
2) Nous pouvons étendre la commande du shell en ligne en:
3) Utilisation (après le chmod habituel):
la source