awkCó thể chạy các awkchức năng. Để nó chạy các bashhàm, bạn cần awkthực thi một trình bashbao, bashđể diễn giải định nghĩa của hàm đó và gọi hàm đó, với giá trị được trích xuất bằng cách awkchuyển qua làm đối số.
Không tầm thường.
bashhỗ trợ xuất các hàm để nó có sẵn trong các lần gọi tiếp theo bash, vì vậy đó là một cách để chuyển định nghĩa của hàm sang lệnh bashđược gọi bởi awk:
export -f d2h
Các cách duy nhất awkđể thực thi một lệnh ( bashở đây) là bằng lệnh system("cmd")hoặc print... | "cmd"hoặc "cmd" | getline. Trong mọi trường hợp, awkchạy một cái vỏ để giải thích điều đó cmd, nhưng nó sẽ shkhông bash. Vì vậy, bạn cần xây dựng một dòng lệnh cho shđó là một bashlời gọi diễn giải một bashdòng lệnh để gọi hàm, vì vậy bạn cần cẩn thận với trích dẫn:
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))}'
Điều đó không có nghĩa là chạy một shvà một bashcho mỗi dòng, do đó sẽ khá kém hiệu quả. Điều đó cuối cùng thậm chí còn kém hiệu quả hơn nhiều so với việc bashđọc và chia tách với while read loop:
(unset IFS; while read -r a b rest; do
printf '%s\n' "$a"
d2h "$b"
done < file)
d2hlà một tệp thực thi, nhưng không phải là "hàm được định nghĩa trong .bashrc hoặc trong tập lệnh shell".