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 або в скрипті оболонки".