Невозможно сделать функцию факториала в AWK - PullRequest
0 голосов
/ 25 апреля 2009

код

 #!/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

Что означает сообщение об ошибке?

Ответы [ 6 ]

4 голосов
/ 25 апреля 2009

Я думаю, что проблема в том, что вы пишете сценарий оболочки и передаете его в 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.

Думайте о том, как она вздыхает, как о том, что возьмите то, что следует за ней, добавьте имя файла и выполните его . Википедия описывает использование довольно хорошо, включая некоторые распространенные способы решения проблемы пути к интерпретатору .

3 голосов
/ 23 июня 2009

может быть, это было не так сложно.

#! / Usr / bin / awk ---------> #! / Usr / bin / awk -f

3 голосов
/ 25 апреля 2009

Возможно, глупый ответ, но в моем терминале мне нужно было бы набрать:

./factorial.awk

, где файл - factorial.awk.

Вы можете отредактировать переменную окружения вашего пути для включения. но ./ должно работать нормально, я думаю. И добавление. $ PATH может оказаться очень опасным в некоторых ситуациях, когда вы будете запускать код, который вы не ожидали.

Это работает ??

EDIT:

. / 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: ")
}
2 голосов
/ 25 апреля 2009

Проверьте, есть ли файл /usr/bin/gawk; если нет, используйте либо путь awk, либо правильное местоположение gawk.

Кроме того, вы сделали сценарий исполняемым?

А также, у вас есть текущий каталог в вашей PATH?

1 голос
/ 26 апреля 2009

Я получил скрипт для работы в Ubuntu и OS X, запустив

awk -f factorial.awk

Кажется, что вы не можете запустить скрипт следующим образом, хотя в книге так сказано

./factorial.awk 
0 голосов
/ 25 июня 2009

Вот рекурсивная версия:

#!/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: ")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...