无法在AWK中创建阶乘函数

时间:2009-04-24 23:48:38

标签: awk factorial

代码

 #!/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 个答案:

答案 0 :(得分:4)

我认为问题在于您正在编写shell脚本并将其传递给awk执行。以下是shell脚本,因此是#! /bin/sh,因此它将传递给shell(在本例中为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
}

she-bang调用awk并传递脚本作为输入。在这种情况下,您不需要显式调用awk,并且您不必引用整个脚本,因为它直接传递给awk

想想她的砰砰声说接下来的事情,追加文件的名称,并执行它Wikipedia很好地描述了用法,包括解决path to the interpreter问题的一些常用方法。

答案 1 :(得分:3)

可能是一个愚蠢的答案,但在我的终端我必须输入:

./factorial.awk

文件是factorial.awk。

您可以编辑要包含的路径环境变量。但./应该工作得很好我想。并添加。在你运行你没想到的代码的某些情况下,$ PATH可能会被证明是非常危险的。

这有用吗?

编辑:

./ factorial.awk -bash:./ factorial.awk:/ usr / bin / gawk:bad interpreter:没有这样的文件或目录

那说它运行文件但找不到程序gawk。 请输入'which gawk'然后'which awk'。

你的第一行应该是:

#!/usr/bin/awk

另外,只是为了逗我,输入:

sudo apt-get install 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 :(得分:3)

可能不是那么复杂。

#!/ usr / bin / awk ---------&gt; #!/ usr / bin / awk -f

答案 3 :(得分:2)

检查是否有文件/usr/bin/gawk;如果没有,请使用awk的路径或gawk的正确位置。

另外,你是否让脚本可执行?

而且,你的PATH中有当前目录吗?

答案 4 :(得分:1)

我通过运行

让脚本在Ubuntu和OS X中运行
awk -f factorial.awk

虽然这本书是这样说的,但似乎你不能按照以下方式运行脚本

./factorial.awk 

答案 5 :(得分:0)

这是一个递归版本:

#!/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: ")
}

答案 6 :(得分:0)

这个问题是 Google 上搜索词组“awk factorial”的热门搜索词,所以这里有一种在 awk 中打印阶乘的简单方法:

$ awk 'BEGIN{x=1;for(i=2;i<=6;i++)x*=i;print x}'
720

作为一个shell函数(-v后面的空格是macOS自带的nawk需要的,gawk不需要):

$ fac(){ awk -v "n=$1" 'BEGIN{x=1;for(i=2;i<=n;i++)x*=i;print x}';}
$ fac 6
720

作为用于计算 k-组合的 awk 函数:

$ 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