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, либо в сценарии оболочки».