awkpuò eseguire awkfunzioni. Affinché bashfunzioni, dovresti awkeseguire una bashshell, quella bashper interpretare la definizione di quella funzione, e chiamare quella funzione, con il valore estratto da awkpassato come argomenti.
Non banale.
bashsupporta l'esportazione di funzioni, quindi è disponibile nelle successive invocazioni di bash, quindi è un modo per passare la definizione della funzione a quella bashinvocata da awk:
export -f d2h
Gli unici modi per awkeseguire un comando ( bashqui) sono con il suo system("cmd"), o print... | "cmd"o "cmd" | getline. In tutti i casi, awkcorre un guscio di interpretare che cmd, ma sarà sh, no bash. Quindi è necessario costruire una riga di comando per shquella è bashun'invocazione che interpreta una bashriga di comando per invocare la funzione, quindi è necessario fare attenzione con la citazione:
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))}'
Ciò significa che eseguire uno she uno bashper ogni riga, quindi sarà abbastanza inefficiente. Ciò finirebbe per essere significativamente più inefficiente rispetto a dover bashleggere e dividere con un while read loop:
(unset IFS; while read -r a b rest; do
printf '%s\n' "$a"
d2h "$b"
done < file)
d2hfosse un eseguibile, ma non se si tratta di una "funzione definita in .bashrc o in shell script".