-1

编码

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

错误信息是什么意思?

4

7 回答 7

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.

将 she-bang 想象为在 she-bang后面加上文件名,然后执行它维基百科很好地描述了这种用法,包括一些解决解释器问题路径的常用方法。

于 2009-04-25T15:59:17.410 回答
3

可能没那么复杂。

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

于 2009-06-23T02:39:18.490 回答
3

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

./factorial.awk

其中文件是 factorial.awk。

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

那样有用吗??

编辑:

./factorial.awk -bash: ./factorial.awk: /usr/bin/gawk: 错误的解释器:没有这样的文件或目录

这表示它运行了文件但找不到程序 gawk。请输入“which gawk”,然后输入“which 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: ")
}
于 2009-04-24T23:51:37.593 回答
2

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

另外,您是否使脚本可执行?

而且,您的 PATH 中是否有当前目录?

于 2009-04-25T00:02:48.347 回答
1

我通过运行使脚本在 Ubuntu 和 OS X 中工作

awk -f factorial.awk

尽管书上这样说,但您似乎无法按以下方式运行脚本

./factorial.awk 
于 2009-04-25T21:59:59.180 回答
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: ")
}
于 2009-06-25T06:29:33.910 回答
0

这个问题是谷歌搜索短语“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
于 2021-04-17T17:46:44.997 回答