関数を使用しないと、パターンが機能するため少し混乱します。しかし、一方ではそうではありません。
入力ファイル:
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]
number
END
number
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
結果に関連付けられている文字を評価する0
か1
(現在の行が一致するかどうかに応じて)++number
文字列として評価します。
A()
ブロックから関数のみを呼び出すため、END
関数number
は一度だけ増加するため、常に1
出力が得られます。