如何用惯用的awk写这个?

时间:2011-08-20 11:13:29

标签: awk idiomatic

以下程序打印出文件的名称,行数以及以//开头的行数,超过五分之一的行以此方式开始。

awk '$1 == "//" { a+=1 } END { if (a * 5 >= NR) {print FILENAME " " NR " " a}}' MyClass.java

这很有效,但嵌套的{{}}让我怀疑我是否正确行事,因为知道awk程序的典型结构是:

awk 'condition { actions }'

所以我怀疑像

这样的东西
awk '$1 == "//" { a+=1 } END  && (a * 5 >= NR) {print FILENAME " " NR " " a}' MyClass.java

会更合适,但每次尝试都会产生语法错误。有没有正确的方法来做到这一点,或者我的方法是如此好。

1 个答案:

答案 0 :(得分:2)

还有其他表达方式,但是你第一次惯用它来写它。尽管作者倾向于在可能的情况下省略大括号,但您仍然可以在 AWK编程语言中找到类似代码的示例。他们应该知道。

似乎Aho,Weinberger和Kernighan在语法源于C的语言中有几个世纪的开发经验。当他们写这样的东西时

if (a * 5 >= NR) 
    print FILENAME " " NR " " a

它完美地传达了if语句后面的块应该包含一个且只有一个语句。

我有几个世纪的经验。每当我读取之类的东西时,它就能完美地传达a)有人忘记输入{},以及b)其他人即将通过在不添加大括号的情况下向该块添加语句来引入错误。

多年来,每当我输入if时,我都会训练自己打字。

if () {}

然后我回去把它填满,如果我需要的话会打破线条。在我的普通编辑器中,“if”会自动扩展为“if(){}”。我很确定自从20世纪80年代中期以来我甚至没有遗漏过一次大括号。