awkможе запускати awkфункції. Щоб вона запускала bashфункції, вам потрібно awkвиконати bashоболонку, bashщоб інтерпретувати визначення цієї функції та викликати її, зі значенням, вилученимawk переданим як аргументи.
Не банально.
bashпідтримує функції експорту, тому вона доступна в наступних викликах bash, тому це один із способів передавати визначення функції bashвиклику awk:
export -f d2h
Єдиними способами awkвиконання команди ( bashтут) є її system("cmd"), print... | "cmd"або "cmd" | getline. У всіх випадках awkзапускає оболонку для інтерпретації цього cmd, але це буде sh, ні bash. Отже, вам потрібно побудувати командний рядок, shякий є bashвикликом, який інтерпретує bashкомандний рядок для виклику функції, тому вам потрібно бути обережними при цитуванні:
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))}'
Це означає запускати один shі один bashдля кожного рядка, тому буде досить неефективно. Це в кінцевому підсумку буде навіть значно неефективнішим, ніж bashчитання та розділення за допомогою while read loop:
(unset IFS; while read -r a b rest; do
printf '%s\n' "$a"
d2h "$b"
done < file)
d2hбуло виконуваним файлом, але не, якщо це "функція, визначена або в .bashrc або в скрипті оболонки".