开发者

How to write this in idiomatic awk?

The following program prints out the name of the file, the number of rows, and the number of rows that begin with // in the case that more than one fifth of the开发者_如何学Go rows begin that way.

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

This works, but the nested {{}} make me question if I'm doing it right, knowing that the typical structure of an awk program is:

awk 'condition { actions }'

So I suspect that something like

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

would be more appropriate, but every such attempt gives syntax errors. Is there a right way to do this, or is my approach as good as it gets.


There are other ways to express it, but you wrote it idiomatically the first time. Although the authors tend to omit braces whenever they can, you can still find examples of code like that throughout The AWK Programming Language. They should know.

It seems like Aho, Weinberger, and Kernighan have several centuries of development experience in languages whose syntax derives from C. And when they write something like this

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

it communicates perfectly that the block following the if statement is supposed to contain one and only one statement.

I have considerably fewer centuries of experience. Whenever I read something like that, it communicates perfectly that a) somebody forgot to type {}, and b) somebody else is about to introduce a bug by adding a statement to that block without adding the braces.

Over the years, I've trained myself to type this whenever I type an if.

if () {}

Then I go back and fill it in, breaking lines if I need to. In my normal editor, "if" expands automatically to "if () {}". I'm pretty sure I haven't omitted braces even once since the mid-1980s.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜