2

私はUNIXプログラミング環境を読んでいます。セクション4.4のawkについては、次のサンプルコードがあります。

    awk '
    FILENAME != prevfile {   # new file
        NR = 1               # reset line number
        prevfile = FILENAME
    }
    NF > 0 {
        if ($1 == lastword)
            printf "double %s, file %s, line %d\n",$1,FILENAME,NR
        for (i = 2; i <= NF; i++)
            if ($i == $(i-1))
                printf "double %s, file %s, line %d\n",$i,FILENAME,NR
        if (NF > 0)
            lastword = $NF
    }' $*

パターンとしてすでにNF>0を持っているブロック内でNF>0がテストされるのはなぜですか?

4

2 に答える 2

3

この本の正誤表に含まれています:

Page 121, first program: test "if (NF > 0)" is unnecessary.

それで、それは出版社やコピー編集者によってなされた間違いでした。

于 2012-10-08T04:21:26.520 に答える
1

NFは0である可能性があるため、NF> 0は、この行にフィールドがあるかどうかを確認するために使用されます。

私はあなたに例をあげます:

awk '{print "hello";}' -
1
hello

hello

「1」と書くとブロックが実行され(「hello」と印刷)、空の行に入ると再び実行されました(2番目の「hello」)

コードを次のように変更した場合:

awk 'NF > 0 {print "hello";}' -
1
hello

NFが0であるため、入力が空の行の場合、2番目の「hello」は表示されません。

于 2012-09-04T14:27:33.757 に答える