【问题标题】:awk loop printing wrong number of timesawk 循环打印错误的次数
【发布时间】:2021-07-27 15:16:35
【问题描述】:

我有一个这样的文件(空格标签):

Agent 299301 1
Person 259672 2
Place 208239 3
Location 208239 4
PopulatedPlace 156701 5
Region 153246 6
AdministrativeRegion 153246 7
Work 96536 8
Agent 299301 1
Person 259672 2

我想为每一行返回一个不同的数字,就像它出现在第二列中一样多次

例如: 先返回号码1299301次,再返回2259672次,再返回3208239次

为此,我正在使用这个 awk 命令:

cat file | awk -F ' ' '{for (i=1; i<=$2; i++) print NR}'  > output

第二列上的小数字似乎效果很好,但在这个文件示例中,我不知道为什么返回每个数字(在这种情况下为1)的次数不正确:

它返回数字1 558973 次而不是 299301

但它在文件的其余行中返回正确的数字(数字2, 3, 4...

如果我在文件中添加更多行,它还会返回错误的次数,编号为2, 3, 4,直到编号为9,但它也适用于编号10, 11, 12, 13...

所以我不知道为什么会这样,希望你能帮助我。

提前致谢。

【问题讨论】:

  • 如何检查给定数字在输出中出现的次数?
  • 顺便说一句,欢迎来到 Stack Overflow!如果您需要提示,请查看tourHow to Ask。使问题标题更具描述性会有所帮助,例如“为什么 AWK 重复错误的次数?”你可以edit
  • 请注意,由于第 1 行,1 输出了 299301 次,但由于第 9 行,又输出了 299301 次。
  • @choroba 不是,打印的不是$3,而是NR...不过你的评论还是很有趣的。
  • 看来558973的意义在于它是299301+259672。 IDK 为什么。

标签: bash awk windows-subsystem-for-linux


【解决方案1】:

这不是您的脚本错误,而是您尝试验证其输出的方式。您将输出传送到 grep '1' | wc -l 或类似的,因此正在计算 1s (299301) 的数量 + 10s (259672) 的数量,因此得到总数 558973

$ awk '{for (i=1; i<=$2; i++) print NR}' file | grep '1' | wc -l
558973

$ awk '{for (i=1; i<=$2; i++) print NR}' file | grep '^1$' | wc -l
299301

顺便说一句,cat file-F ' ' 并没有造成任何真正的伤害,但在这种情况下它们也没有任何用处,只需像我上面所做的那样使用 awk '{for (i=1; i&lt;=$2; i++) print NR}' file

【讨论】:

    【解决方案2】:

    当输入问题中提供的输入时,问题中提供的程序为我输出了 '1' 正好 299301 次,正如您所期望的那样。我倾向于认为@choroba 对这个问题的评论表明了 不同 程序的性质,您使用该程序观察到 558973 行“1”。也就是说,这里的那个,或者基本上等同的东西:

    cat file | awk -F ' ' '{for (i=1; i<=$2; i++) print $3}'  > output
    

    不同之处在于,一个打印输入行号NR,而另一个打印从输入行读取的第三个字段$3

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 2015-12-09
      相关资源
      最近更新 更多