无法在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