awk
pode executar awk
funções. Para executar bash
funções, você precisa awk
executar um bash
shell que bash
interprete a definição dessa função e chame essa função, com o valor extraído por awk
passado como argumentos.
Não é trivial.
bash
suporta funções de exportação, para que esteja disponível em chamadas subsequentes de bash
, portanto, é uma maneira de passar a definição da função para a bash
chamada por awk
:
export -f d2h
As únicas maneiras de awk
executar um comando ( bash
aqui) são com system("cmd")
, ou print... | "cmd"
ou "cmd" | getline
. Em todos os casos, awk
executa um shell para interpretar isso cmd
, mas será sh
, não bash
. Portanto, você precisa construir uma linha de comando, pois sh
essa é uma bash
chamada que interpreta uma bash
linha de comando para chamar a função; portanto, você deve ter cuidado ao 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))}'
Isso significa executar um sh
e um bash
para cada linha, por isso será bastante ineficiente. Isso acabaria sendo ainda mais ineficiente do que bash
fazer a leitura e a divisão com um while read loop
:
(unset IFS; while read -r a b rest; do
printf '%s\n' "$a"
d2h "$b"
done < file)
d2h
fosse um executável, mas não se for uma "função definida no .bashrc ou no shell script".