AWK - 関数を使用してファイル内のすべての数値を計算する方法

AWK - 関数を使用してファイル内のすべての数値を計算する方法

関数を使用しないと、パターンが機能するため少し混乱します。しかし、一方ではそうではありません。

入力ファイル:

asd
111
22
3333
mike
44444
mas

私のawk機能:(常に4の代わりに1を印刷します)

function A(){
/[0-9]/ number++
print number
}

END{
A()
}

関数の外部で使用すると1パターンは機能しますが、内部では常に印刷されます。問題は何ですか?

答え1

/[0-9]/通常、これらのパターンは使用されません。~へブロック。それらは、次のように、より一般的に使用されます。

pattern { block }

関数内の文字列の正規表現をテストするには、次のようにしますmatch()

function A() {
    if (match($0, "[0-9]"))
        ++number
}

{
    A()
}

END {
    print number
}

A()各行を呼び出して、少なくとも1つの数字を含む行数を計算します。この関数は正規表現を行の内容と一致させ、A()一致すると1ずつ増やします。このブロックは、実行が終了すると結果を印刷します。[0-9]numberENDnumber

if (match($0, "[0-9]"))代わりに使用することもできますが、if (/[0-9]/)よりmatch()柔軟です。

awkプログラムと同じ効果があります。

/[0-9]/ { ++number }

END     { print number }

どこかに数字を含む行数ではなく、正の整数のみを含む行数を計算するには、^[0-9]+$正規表現として使用します。

重要なことは、A()各入力行に対して関数を呼び出す必要があり、number変数の値をブロックに印刷する必要があることですEND


次のような通事論受け入れられたPOSIXawk構文しかし、プログラムはいいえ数値を含む行数を計算しますが、行も計算します。

function A() {
    /[0-9]/ ++number
}

{
    A()
}

END {
    print number
}

この文は、/[0-9]/ ++number結果に関連付けられている文字を評価する01(現在の行が一致するかどうかに応じて)++number文字列として評価します。

A()ブロックから関数のみを呼び出すため、END関数numberは一度だけ増加するため、常に1出力が得られます。

関連情報