我试图通过做一些Project Euler问题来学习awk。
这是我的代码。我不知道为什么会挂起来。请指教
$ awk '{ sum=0
> for (i=3; i<=1000; i++){
> if ((i % 3 == 0) || (i % 5 == 0))
> sum+=i
> }
> print sum }'
答案 0 :(得分:2)
将整件事放在BEGIN
区块中:
awk 'BEGIN { sum=0
for (i=3; i<=1000; i++){
if ((i % 3 == 0) || (i % 5 == 0))
sum+=i
}
print sum }'
答案 1 :(得分:1)
awk
非常相似的 sed
适用于通过STDIN
或文件名提供的输入。你没有提供这样的输入。
你想要的是这样的:
$ echo | awk '{sum=0; for (i=3; i<=1000; i++){if ((i % 3 == 0) || (i % 5 == 0))sum+=i}print sum}'
请注意,我将echo
的输出(实际上只是换行符)传递给了awk,因此它可以至少执行一次循环
答案 2 :(得分:1)
这里有2个问题
Awk通常一次处理一行除了BEGIN或END块中的代码
当你连接到一个管道时,awk可以从STDIN中读取,或者当你给一个fileName作为输入时,SiegeX会解释它。
这应该为你解决。
$ awk 'END{
sum=0
for (i=3; i<=1000; i++){
if ((i % 3 == 0) || (i % 5 == 0))
sum+=i
}
print sum
}' /dev/null
/ dev / null是一个有效的fileName,它不包含任何数据。所以awk中的'main'循环运行。 然后程序检测到“没有更多数据,运行END块的时间”
我希望这会有所帮助。