Невозможно создать факториальную функцию в 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
Что означает это сообщение об ошибке?
Решение
Я думаю, проблема в том, что вы пишете сценарий оболочки и передаете его на выполнение 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 , чтобы включить ее .но, я думаю, ./ должно сработать просто отлично.И добавляющий .путь к $PATH может оказаться очень опасным в некоторых ситуациях, когда вы будете запускать код, которого не ожидали.
Это работает??
Редактировать:
./факториал.awk -bash:./факториал.awk:/usr/bin/gawk:плохой переводчик:Такого файла или каталога нет
Это говорит о том, что он запустил файл, но не смог найти программу gawk.Пожалуйста, введите "which gawk", а затем "which awk".
Ваша первая реплика должна быть такой:
#!/usr/bin/awk
Кроме того, просто чтобы позабавить меня, введите:
sudo apt-get install gawk
Это позволит убедиться, что у вас действительно есть gawk в вашей системе.
РЕДАКТИРОВАТЬ 2:Я взглянул на ваш код, и это то, что у меня есть сейчас.Я убрал две кавычки и тире.
#!/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
Вот рекурсивная версия:
#!/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: ")
}