# 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 я могу общаться с программой bc, используя fifo. Но в awk я могу писать, но не читать с функцией getline. Как читать «/ dev/fd/4» в awk.Использование bc в качестве демона в оболочке BASH из awk
Моя AWK версия: 1.3.3 Mawk ноября 1996, Copyright (C) Майкл Д. Бреннан
Благодаря Лачи
Продолжение:
Я сделал некоторые дополнительные эксперимент и я резюмируем мой результат. Язык сценария 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 использование Ъса немного медленнее (примерно в 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) Что может быть проблема, когда я пытаюсь сделать accordig к «человек AWK»? :
# 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.
Работает отлично с gawk. Не работает с mawk. Какой awk вы используете? –
Вы должны включить это в свой вопрос! У меня есть тот же «mawk», и он терпит неудачу, как вы. Но с 'gawk' он отлично работает. –