【问题标题】:awk 2nd calculation in scriptawk 脚本中的第二次计算
【发布时间】:2014-06-10 00:42:41
【问题描述】:

awk 可能让我头疼。我试图总结某一行的一定数量的行。

cat /home/logger/uplog.txt | awk 'NR==1,NR==7 {print $5}';

我知道这只会给我字段 1 到 7 的输出。我尝试的是

awk 'NR==1,NR==7 {print sum += $5}

但结果看起来没有我的预期。那么我该如何进行这个简单的计算,因为这是该脚本中的第二个 awk 命令,因此要再读一次。顺便说一句,也包括这个问题,如何在 awk 语句中的一定数量的行之后写入 /dev/null,例如

(R=0,R<=181,R++)
for R in FNR>=181 /dev/null ;

任何提示,在此先感谢。

【问题讨论】:

  • 字段分隔符并在 stackoverflow 上阅读。
  • NR==1,NR==7 表示有两个用逗号分隔的模式:一个在记录号为 1 时匹配,另一个在记录号为 7 时匹配。所以{ action } 执行第一行,为第七行。这就是你想要的吗?
  • 如果您只想打印sum,请执行{sum += $5},然后将打印内容放入END 块中:END { print sum }
  • 另外,不需要catawk 接受输入文件参数:awk 'script' yourfile
  • @Kaz:你说,so the { action } executes for the first line and for the seventh line.其实awk支持range语法类似于sed的:NR==1,NR==7指的是inclusive记录范围 1 7.

标签: bash awk


【解决方案1】:

您对 awk 语法、术语和行为感到非常困惑。在再次尝试编写 awk 脚本之前,您应该获取并阅读 Arnold Robbins 的书 Effective Awk Programming, Third Edition

让我们看看这是否有助于解决您当前的问题:

要从每个输入记录的字段 1 打印到字段 7 是:

{
    for (i=1; i<=7; i++) {
        print $i
    }
}

改为打印这些字段的值的总和是:

{
    sum=0
    for (i=1; i<=7; i++) {
        sum += $i
    }
    print sum
}

要将记录(默认为行)5 到 10 写入 /dev/null 将是:

NR>=5 && NR<=10 { print > "/dev/null" }

这是否回答了您当前的问题?

【讨论】:

  • 我可以用 Aho、Kernighan 和 Weinberger 的 The AWK Programming Language 来代替 O'Reilly 的书。这是我读过的最好的编程书籍之一。 cm.bell-labs.com/cm/cs/awkbook/index.html
  • 那本书写于将近 30 年前,因此已经过时并且缺少现代 awks 的所有功能。我不会明白的。
  • 那本书是由 AWK 的创建者 编写的,它(保守地)涵盖了所有 AWK 中 80% 的最有用的功能。你的回答,但我不能更强烈地反对哪本书更有价值。
  • 另一本书是由 GNU awk 的创建者编写的,它在今天比 1970 年代中期通常被称为旧的、损坏的 awk 的工具更具相关性。是的,旧书涵盖了 80% 的 awk 功能,但新书涵盖了几乎 100%,包括所有现代主要内容和 POSIX 功能。真的没有可比性 - 获得那本 awk 旧书就像购买 1980 年代的电视操作手册。
  • 你真的完全没有抓住重点。 Robbins book——顺便说一句,不是一个“b”——很好。这是一本非常好,平庸的书。我确信它涵盖了 GNU awk 的许多闪亮特性。另一个是经典,可以帮助您更多地了解编程时期。你 1980 年代的电视手册完全放错地方了。 Aho、Kernighan 和 Weinberger 这本书的全部意义在于它只是一本手册。
猜你喜欢
  • 1970-01-01
  • 2013-09-10
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多