gpt4 book ai didi

linux - 在 awk 的 BASH shell 中使用 bc 作为守护进程

转载 作者:太空狗 更新时间:2023-10-29 12:15:01 24 4
gpt4 key购买 nike

# mkfifo inp out
# bc -ql <inp >out &
[1] 6766
#
# exec 3>inp 4<out
# echo "scale=3; 4/5;" >&3
# read a <&4; echo $a
.800
#
# awk ' BEGIN { printf("4/5\n") >"/dev/fd/3"; exit 1;} '
# read a <&4; echo $a
.800
#
# awk ' BEGIN { printf("4/5\n") >"/dev/fd/3"; exit 1;} '
# awk ' BEGIN { getline a <"/dev/fd/4"; printf("%s\n", a); } '
^C

在 BASH 环境中,我可以使用 fifo 与 bc 程序通信。但是在 awk 中我可以写但不能用 getline 函数读取。我如何在 awk 中读取“/dev/fd/4”。

我的 awk 版本是:mawk 1.3.3 1996 年 11 月,版权所有 (C) Michael D. Brennan

谢谢拉奇

继续:

我做了一些进一步的实验并总结了我的结果。Awk 脚本语言最适合我的任务,我需要使用“bc”,因为我必须计算非常长的数字(大约 100 位数字)。接下来的两个脚本显示使用命名管道比未命名管道快(大约 83 倍)。

1) 使用未命名的管道:

# time for((i=6000;i;i--)); do a=`echo "$i/1"|bc -ql`; done
real 0m13.936s

2) 使用命名管道:

# mkfifo in out
# bc -ql <in >out &
# exec 3>in 4<out
#
# time for((i=500000;i;i--)); do echo "$i/1" >&3; read a <&4; done
real 0m14.391s

3) 在 awk 环境中,bc 的使用比在 bash 中慢一点(大约 18 倍),但它是这样工作的:

# time awk ' BEGIN {
# for(i=30000;i;i--){
# printf("%d/1\n",i) >"/dev/fd/3";
# system("read a </dev/fd/4; echo $a >tmp_1");
# getline a <"tmp_1"; close("tmp_1");}
# } '
real 0m14.178s

4) 当我尝试对“man awk”进行 Accordion 操作时,可能会出现什么问题? :

# awk ' BEGIN {
# for(i=4;i;i--){
# printf("%d/1\n",i) >"/dev/fd/3"; system("sleep .1");
# "read a </dev/fd/4; echo $a" | getline a ;print a;}
# } '
4.000
4.000
4.000
4.000

上面的“awk”脚本只能从管道中获取第一个数字。其他三个数字留在管道中。当我在上面的 awk 脚本之后读取管道时,这些将是可见的。

# for((;;)); do read a </dev/fd/4; echo $a; done
3.000
2.000
1.000

感谢您的关注。

最佳答案

听起来您正在寻找 gawk 的协同处理能力,请参阅 http://www.gnu.org/software/gawk/manual/gawk.html#Getline_002fCoprocess .不过,考虑到 awks 对数学函数的支持,我想知道您为什么要使用 bc...

关于linux - 在 awk 的 BASH shell 中使用 bc 作为守护进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28594499/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com