Невозможно сделать функцию факториала в AWK
Код
#!/usr/bin/awk
# Sed and AWK by O'Reilly (p.179)
# Example of what should happen: factorial 5 gives
# factorial
# Enter number: 3
# The factorial of 3 is 6
BEGIN {
printf("Enter number: ")
}
$1 ~ /^[0-9]+$/ {
# assign value of $1 to number & fact
number = $1
if (number == 0)
fact = 1
else
fact = number
for (x = 1; x < number; x++)
fact *=x
printf("The factorial of %d is %g\n", number, fact)
exit
}
# if not a number, prompt again.
{ printf("\nInvalid entry. Enter a number: ")
}
Я безуспешно запускаю команду
./factorial.awk
я получил
/usr/bin/awk: syntax error at source line 1
context is
>>> <<< ./factorial.awk
/usr/bin/awk: bailing out at source line 1
Что означает сообщение об ошибке?
7 ответов
Я думаю, что проблема в том, что вы пишете сценарий оболочки и передаете его в awk для выполнения. Ниже приведен сценарий оболочки, следовательно, #! /bin/sh
, так что он будет передан оболочке (в данном случае Bourne-совместимой).
#! /bin/sh
awk 'BEGIN { printf("Hello world!\n"); exit }'
Строка she-bang (#!) Сообщает текущему интерпретатору, какому интерпретатору передать скрипт для выполнения. Вы должны передать сценарий awk
переводчик, так что вам нужно позвонить awk
в явном виде. Это предполагает, что awk
где-то на вашем пути
Следующее, однако, является awk
скрипт.
#! /usr/bin/awk -f
BEGIN {
printf("Hello world!\n");
exit
}
Она взывает awk
и передает сценарий в качестве входных данных. Вам не нужно явно вызывать awk
в этом случае вам не нужно цитировать весь скрипт, так как он передается непосредственно awk
,
Подумайте о том, что она вздыхает, как сказать: " Возьми то, что следует за ней, добавь имя файла и выполни его". Википедия довольно хорошо описывает использование, включая некоторые распространенные способы решения проблемы с интерпретатором.
Возможно, глупый ответ, но в моем терминале я должен был бы ввести:
./factorial.awk
где файл factorial.awk.
Вы можете отредактировать переменную окружения вашего пути, чтобы включить. но./ должно работать нормально, я думаю. И добавление. $PATH может оказаться очень опасным в некоторых ситуациях, когда вы будете запускать код, который вы не ожидали.
Это работает??
РЕДАКТИРОВАТЬ:
./factorial.awk -bash:./factorial.awk: / usr / bin / gawk: плохой интерпретатор: такого файла или каталога нет
Это говорит о том, что он запустил файл, но не смог найти программу gawk. Пожалуйста, введите "который gawk", а затем "который awk".
Ваша первая строка должна быть:
#!/usr/bin/awk
Кроме того, просто чтобы развлечь меня, введите:
sudo apt-get install gawk
Это позволит вам убедиться в том, что в вашей системе есть gawk.
EDIT2: я посмотрел на ваш код, и это то, что у меня есть сейчас. Я удалил две цитаты и тире.
#!/usr/bin/gawk
# I think we do not need these (p.179) so I comment them out, since I do not know where else to put them.
# The same bug occurs also with them.
#fact = number
#for (x = number -1 ; x > 1; x--)
# fact *= x
awk # factorial: returns factorial of user-supplied number
BEGIN {
printf("Enter number: ")
}
$1 ~ /^[0-9]+$/ {
# assign value of $1 to number & fact
number = $1
if (number == 0)
fact = 1
else
fact = number
#loop to multiply fact*x until x = 1
for (x = number - 1; x > 1; x--)
fact *= x
printf("The factorial of %d is %g\n", number, fact)
#exit -- saves user from typing ^-d
exit
}
# if not a number, prompt again.
{ printf("\nInvalid entry. Enter a number: ")
}
Может быть, это было не так сложно.
#! / usr / bin / awk ---------> #! / usr / bin / awk -f
Проверьте, есть ли файл /usr/bin/gawk
; если нет, используйте либо путь awk, либо правильное местоположение gawk.
Кроме того, вы сделали сценарий исполняемым?
А также, у вас есть текущий каталог в вашей PATH?
Я получил скрипт для работы в Ubuntu и OS X, запустив
awk -f factorial.awk
Кажется, что вы не можете запустить сценарий следующим образом, хотя в книге так сказано
./factorial.awk
Этот вопрос был самым популярным в Google по поисковой фразе "awk factorial", поэтому вот простой способ вывести факториал в awk:
$ awk 'BEGIN{x=1;for(i=2;i<=6;i++)x*=i;print x}'
720
В качестве функции оболочки (пробел после
-v
требуется для nawk, который поставляется с macOS, но не для gawk):
$ fac(){ awk -v "n=$1" 'BEGIN{x=1;for(i=2;i<=n;i++)x*=i;print x}';}
$ fac 6
720
Как awk-функция для вычисления k-комбинаций:
$ awk 'function f(x){r=1;for(i=2;i<=x;i++)r*=i;return r}BEGIN{n=5;k=3;print f(n)/(f(k)*f(n-k))}'
10
Вот рекурсивная версия:
#!/usr/bin/awk -f
function f(x) {
if (x <= 1) return 1
return (f(x-1) *x)}
BEGIN {
printf("Enter number: ")
}
$1 ~ /^[0-9]+$/ {
printf("The factorial of %d is %d\n", $1, f($1))
exit
}
{ printf("\nInvalid entry. Enter a number: ")
}