15

パターンごとに何かを実行して、多くの可能なパターンをチェックする awk スクリプトがあります。どのパターンも一致しなかった場合に備えて、何かをしたいです。つまり、次のようなものです。

/pattern 1/ {action 1}
/pattern 2/ {action 2}
...
/pattern n/ {action n}
DEFAULT {default action}

もちろん、「DEFAULT」行は awk 構文ではなく、そのような構文があるかどうかを知りたいです (通常、多くのプログラミング言語の swtich/case ステートメントにあるように)。

もちろん、各アクションの後にいつでも「次の」コマンドを追加できますが、多くのアクションがある場合、これは面倒です。さらに重要なことに、行を 2 つ以上のパターンに一致させることができなくなります。

4

5 に答える 5

15

!次のような否定演算子を使用して一致を反転できます 。

!/pattern 1|pattern 2|pattern/{default action}

しかし、それは にとってかなり厄介ですn>2。または、フラグを使用することもできます。

{f=0}
/pattern 1/ {action 1;f=1}
/pattern 2/ {action 2;f=1}
...
/pattern n/ {action n;f=1}
f==0{default action}
于 2013-07-24T10:23:56.923 に答える
11

GNU awk には switch ステートメントがあります。

$ cat tst1.awk
{
    switch($0)
    {
    case /a/:
        print "found a"
        break

    case /c/:
        print "found c"
        break

    default:
        print "hit the default"
        break
    }
}

$ cat file
a
b
c
d

$ gawk -f tst1.awk file
found a
hit the default
found c
hit the default

または awk を使用:

$ cat tst2.awk
/a/ {
    print "found a"
    next
}

/c/ {
    print "found c"
    next
}

{
    print "hit the default"
}

$ awk -f tst2.awk file
found a
hit the default
found c
hit the default

他のプログラミング言語と同様に、「break」または「next」を必要に応じて使用します。

または、フラグを使用したい場合:

$ cat tst3.awk
{ DEFAULT = 1 }

/a/ {
    print "found a"
    DEFAULT = 0
}

/c/ {
    print "found c"
    DEFAULT = 0
}

DEFAULT {
    print "hit the default"
}

$ gawk -f tst3.awk file
found a
hit the default
found c
hit the default

ただし、真の「デフォルト」とまったく同じセマンティクスではないため、そのような使用法は誤解を招く可能性があります。私は通常、すべて大文字の変数名を使用することを推奨しませんが、小文字の「デフォルト」は gawk キーワードと競合するため、スクリプトは将来 gawk に移植できなくなります。

于 2013-07-24T14:16:29.380 に答える
5

上記の tue で述べたように、Awk の標準的なアプローチについての私の理解は、各選択肢に next を配置し、パターンなしで最終的なアクションを実行することです。

/pattern1/ { action1; next }
/pattern2/ { action2; next }
{ default-action }

次のステートメントは、問題の行に対してこれ以上パターンが考慮されないことを保証します。また、前のアクションが発生しない場合は、デフォルト アクションが常に発生します (すべての次のステートメントのおかげです)。

于 2020-04-05T06:39:42.417 に答える