在awk中找到1到1000之间的3和5的倍数之和

时间:2011-03-16 00:16:33

标签: shell awk

我试图通过做一些Project Euler问题来学习awk。

这是我的代码。我不知道为什么会挂起来。请指教

$ awk '{ sum=0
> for (i=3; i<=1000; i++){
> if ((i % 3 == 0) || (i % 5 == 0)) 
> sum+=i
> }
> print sum }'

3 个答案:

答案 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个问题

  1. Awk通常一次处理一行除了BEGIN或END块中的代码

  2. 当你连接到一个管道时,awk可以从STDIN中读取,或者当你给一个fileName作为输入时,SiegeX会解释它。

  3. 这应该为你解决。

    $ 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块的时间”

    我希望这会有所帮助。