无法在AWK中生成阶乘函数

无法在AWK中生成阶乘函数,awk,factorial,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]+$/ {

代码

 #!/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: ")
 }
我明白了

/usr/bin/awk:源代码第1行出现语法错误
上下文是

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

./factorial.awk
其中文件为factorial.awk

您可以编辑path环境变量以包括。但是我想应该可以。并加上。在某些情况下,使用$PATH可能会非常危险,因为在这些情况下,您可能会运行未预料到的代码

这样行吗

编辑:

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

也就是说,它运行了文件,但找不到程序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/gawk
;如果不是,请使用awk路径或正确的gawk位置

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


还有,您的路径中是否有当前目录?

我认为问题在于您正在编写一个shell脚本并将其传递给awk执行。下面是一个shell脚本,因此是
#/bin/sh
,因此它将被传递到shell(在这种情况下与Bourne兼容)

she-bang(#!)行告诉当前解释器将脚本传递给哪个解释器执行。您必须将脚本传递给
awk
解释器,因此需要显式调用
awk
。这假设
awk
在您的路径中的某个地方

但是,下面是一个
awk
脚本

#! /usr/bin/awk -f
BEGIN {
    printf("Hello world!\n");
    exit
}
she-bang调用
awk
,并将脚本作为输入传递。在这种情况下,不需要显式调用
awk
,也不需要引用整个脚本,因为它直接传递给
awk


可以将shebang想象为:获取shebang之后的内容,附加文件名,然后执行它。非常好地描述了使用方法,包括一些解决问题的常用方法。

我通过运行

awk -f factorial.awk
尽管书中有这样的说明,但您似乎无法按如下方式运行脚本

./factorial.awk 

可能没那么复杂


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

这是一个递归版本:

#!/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: ")
}
#/usr/bin/awk-f
函数f(x){

如果(x这个问题是谷歌搜索短语“awk factorial”的热门话题,那么这里有一个简单的方法可以在awk中打印一个factorial:

$ awk 'BEGIN{x=1;for(i=2;i<=6;i++)x*=i;print x}'
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

$awk'函数f(x){r=1;for(i=2;代码现在是777。你怎么知道我的路径中是否有当前目录?如果PATH=“:/bin:/usr/bin:。:/home/me/bin::”和当前目录(cwd)=/home/me/bin,那么cwd在路径上出现4次:(1)在第一个冒号之前(2)作为两个冒号之间的点(3)作为/home/me/bin(4)在最后一个冒号之后。不要使用777权限;永远不要使文件(尤其是可执行文件)公开可写;担心您的组成员是否也应该具有写权限。(可能更糟;我知道有一个makefile将perms设置为7777(setuid,setgid,sticky bit!),因为键入“/factorial.awk”会引发错误“bash:./factorial.awk:/usr/bin/gawk:bad解释器:没有这样的文件或目录",我的结论是您的计算机没有程序/usr/bin/gawk-正如我的回答中所建议的那样。找到它…使用“which gawk”,如果无法生成答案,则使用“which awk”。如果您获得了路径,请使用它代替/usr/bin/gawk。如果您没有获得路径,则路径上的目录中既没有安装awk也没有安装gawk…continueed…信不信由你,这是相当大的进步。你现在得到的是awk说“我不懂shell脚本”…更进一步说,生活会介入!好吧-将awk和单引号放在顶部附近;将匹配的单引号和尾随破折号放在底部。应该可以。然后键入“sudo apt get install gawk”。/factorial.awkI在计算机中有3.1.5 gawk。dpaste.com示例显示您使用“sudo”运行“chmod”;这是一组危险的prac要进入的权限。在你灾难性地破坏你的系统之前,现在就离开它们。对于你编写的脚本,永远不需要使用sudo来更改权限。你应该在自己的领域内处理自己的文件,在那里你可以更改权限,而不需要根权限。@Jonathan:谢谢你提供的信息mation!我有一个做法,就是在开始调试时先降低权限。我提供的代码在我的机器上运行,但这并不说明什么。我希望它对您有效。您可以非常肯定地将其作为“/factorial.awk”运行。这样做的要求是:(1)用户可以执行它,所以“chmod 0700 factorial.awk”,(2)文件的第一行是“#!/path/to/awk”,因此shell将运行awk,(3)脚本在shell中相对于路径正确执行,“/factorial.awk”将起作用,(4)它是一个有效的awk脚本。将整个脚本包装在“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: ")
}
$ awk 'BEGIN{x=1;for(i=2;i<=6;i++)x*=i;print x}'
720
$ fac(){ awk -v "n=$1" 'BEGIN{x=1;for(i=2;i<=n;i++)x*=i;print x}';}
$ fac 6
720
$ 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