2015-02-18 2 views
2
# 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.

+0

Работает отлично с gawk. Не работает с mawk. Какой awk вы используете? –

+0

Вы должны включить это в свой вопрос! У меня есть тот же «mawk», и он терпит неудачу, как вы. Но с 'gawk' он отлично работает. –

ответ

2

Похоже, что вы ищете возможность совместного процесса поглазеть, см http://www.gnu.org/software/gawk/manual/gawk.html#Getline_002fCoprocess. Учитывая awks поддержку математических функций, хотя, интересно, почему вы хотите использовать bc ...

+0

bc имеет множественную точность. – lhf

+0

Так делает GNU awk. –

0

Try:

mkfifo inp out 
bc -l <inp >out & 
awk ' BEGIN { printf("4/5\n"); exit 0;} ' > inp 
read a < out; echo $a 

awk ' BEGIN { printf("4/5\n"); exit 0;} ' > inp 

awk ' BEGIN { getline a; printf("%s\n", a); exit 0 } ' < out 

rm inp 
rm out 
Смежные вопросы