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