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

发布于 2024-10-22 08:04:50 字数 212 浏览 3 评论 0原文

我正在尝试通过做一些欧拉项目问题来学习 awk。

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

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

I am trying to learn awk by doing some Project Euler questions.

Here is my code. I am not sure why it hangs. please advise

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

漆黑的白昼 2024-10-29 08:04:50

将整个内容放在 BEGIN 块中:

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

Put the whole thing in a BEGIN block:

awk 'BEGIN { sum=0
    for (i=3; i<=1000; i++){
    if ((i % 3 == 0) || (i % 5 == 0)) 
    sum+=i
    }
    print sum }'
爱她像谁 2024-10-29 08:04:50

awksed 非常相似,适用于通过 STDIN 或文件名提供的输入。您没有提供此类输入。

您想要的是这样的:

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

请注意,我将 echo 的输出(本质上只是一个换行符)通过管道传输到 awk,以便它可以至少执行一次循环

awk, much like sed, works on input either provided through STDIN or a filename. You have provided no such input.

What you want is something like this:

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

Notice that I piped the output of echo (essentially just a newline) to awk so it can perform your loop at least once

羁〃客ぐ 2024-10-29 08:04:50

这里有 2 个问题

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

  2. 当附加到管道时,Awk 可以从 STDIN 读取,或者如 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 是有效的文件名,不包含任何数据。所以 awk 中的“主”循环运行了。
然后程序感知到“没有更多数据,是时候运行 END 块了”

我希望这会有所帮助。

You have 2 issues here

  1. Awk normally processes a line at a time Except for the code in a BEGIN or END block

  2. Awk can read from STDIN when attached to a pipe OR as SiegeX explains, when you give a fileName as input.

This should fix it for you.

$ 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 is a valid fileName, that contains no data. So the 'main' loop in awk is run.
Then program senses 'no more data, time to run the END block'

I hope this helps.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文