为啥我的 for 循环在 AWK 中运行和重置?

Posted

技术标签:

【中文标题】为啥我的 for 循环在 AWK 中运行和重置?【英文标题】:Why is my for loop running and resetting in AWK?为什么我的 for 循环在 AWK 中运行和重置? 【发布时间】:2014-04-30 04:28:28 【问题描述】:

我似乎真的无法理解 AWK 及其工作原理。我有这个代码

    awk ' for(i=0; i<NR; i++)print i'

我正在阅读的文件有四行五列。 最终打印出来

0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 为什么我重置和打印出来的次数都不一样? 我只想为每一行打印一次。我似乎无法理解 AWK 中的 for 循环并打印出一行。也有人可以向我解释一下 AWK 是如何工作的?!? 我希望能够遍历每一行并测试 if 语句 if 打印,但我的 if 语句将运行与程序中的行一样多的次数。我已经厌倦了到处寻找答案,但是 AWK 上没有足够的东西来找到任何有用的东西。我正在寻找关于 for 循环、if 语句以及打印如何在 AWK 中工作的非常直接的答案。非常感谢!!

更新问题: 我想读取包含此内容的文件 0 0 0 1 0 0 0 0 0 1 0 1 2 0 0 0 我希望能够遍历每一行并添加行中的所有数字,如果行的总数大于 0,则打印该行,如果不是,则不要打印它。 我也想知道如何打印有多少行的数字。 因此,如果文件有 6 行,则输出将是: 1 2 3 4 5 6 再次感谢!

【问题讨论】:

根据您发布的输入文件,您发布的 awk 脚本不会产生您所说的输出。您的输入文件有 4 列,而不是 5 列,并且您想要的输出是一个有 6 行而不是 4 行的文件。在提问时发布正确的信息很重要,以便我们尽可能轻松地为您提供帮助。 【参考方案1】:

awk 从您的输入文件中一次读取一条记录,将记录拆分为多个字段,然后在您的脚本包含的当前记录上执行您的脚本

<condition>  <action> 

声明。如果condition 在当前记录下为真,则执行action。默认条件为真,默认动作打印当前记录。

使用 awk 打印输入文件中的每一行是:

awk '1' file

因为1 是一个真条件,因此调用打印当前记录的默认操作。

有关更多信息,请获取 Arnold Robbins 的“Effective Awk Programming, Third Edition”一书,并更新您的问题以提供示例输入、所需输出以及更具体的描述,如果您正在尝试做什么仍然不确定。

wrt 你更新的问题,这里是如何做第一部分 (I want to be able to go through each line and add all the numbers in the row and if the row's total is greater than 0 than print the line if not then do not print it.)

$ cat file
0 0 0 1
0 0 0 0
0 1 0 1
2 0 0 0

$ awk 'sum=0; for (i=1;i<=NF;i++) sum+=$i sum>0' file
0 0 0 1
0 1 0 1
2 0 0 0

我不知道您问题的第二部分 (I want to be to just know how to go print a number for how many lines there are) 为何显示您发布的预期输出。请参考您发布的示例输入文件,并告诉我们您希望从该输入文件中获得什么输出。哦等等,你是说你想打印文件中的行号吗? 那就是:

$ awk 'print NR' file
1
2
3
4

【讨论】:

这是完美的回复,谢谢。我现在的问题是在这行代码中---- awk 'sum=0; for (i=1;i0' 文件----你没有打印语句它是如何打印的?以及您的 for 循环如何正确运行。我写了类似的东西,for循环运行的次数与我的行数一样多,所以我的输出看起来像你的,但只打印了四次。 阅读我上面回答的第一部分。正如我所说,awk 是condition action 段,默认操作是打印当前记录,因此通过指定条件sum&gt;0 我不需要也明确声明我想在条件为真时打印记录,因为是给定真实条件的默认行为。与任何语言一样,写“类似的东西”通常会产生截然不同的结果。您得到的结果取决于您编写的内容,并且您发布的脚本不会从您发布的输入文件中产生您发布的输出。 你真的帮了我很多,非常感谢!!我现在真的掌握了窍门。 @jaypal 我累了,但我不能因为它说我没有足够的声望点,因为我的帐户是新帐户。

以上是关于为啥我的 for 循环在 AWK 中运行和重置?的主要内容,如果未能解决你的问题,请参考以下文章

python中为啥我的for循环里嵌套的if只能循环一次?

为啥我的 for 循环没有为 h[i] 运行 5 次?

为啥我的 for 循环覆盖而不是追加?

中断for循环后如何重置指针

使用带有两个变量的 for 循环

为啥for循环在c中无限进行