awkのドア間の区切り記号

awkのドア間の区切り記号

Gawkのマニュアルから:

ルールの awk 文が短い場合は、1 行に複数の文を入力する必要があります。これは、セミコロン( ';')でステートメントを区切ることによって行われます。これはルール自体にも当てはまります。したがって、このセクションの冒頭に表示されるプログラムは次のように書くこともできます。

/12/ { print $0 } ; /21/ { print $0 }

注:元のawk言語には、同じ行の規則をセミコロンで区切る必要はありません。これは、アクションのステートメントの処理と一貫性を維持するために追加されました。

しかし、私は絶対にhttps://stackoverflow.com/q/20262869/156458

awk '$2=="no"{$3="N/A"}1' file

$2=="no"{$3="N/A"}そして2つの声明ではありませんか1?なぜ彼らは何も分からないのですか?

ありがとうございます。

答え1

とても良い質問です!私が考える鍵は次のとおりです。「したがって、このセクションの冒頭に示されている手順は、次のように書くこともできます。この方法:"

このように書くことは必須ではありません。これは代替方法です。これは、以下の記述がすべて真実であることを意味します(実際に証明されています)。

$ awk '/12/ { print $0 } /21/ { print $0 }' file
$ awk '/12/ { print $0 } ; /21/ { print $0 }' file

セミコロンを使用することは、作業部分を省略し、同じ行に複数のルールを適用したい場合など、非常に短い慣用的なコードを扱うためのものだと思います。

$ awk '/12//21/' file
awk: cmd. line:2: /12//21/
awk: cmd. line:2:         ^ unexpected newline or end of string

この場合、セミコロンを使用して規則(=条件)を区切る必要があります。

$ awk '/12/;/21/' file

両方のルール/両方の条件でこの{action}部分が省略されるため、各ルールに対して基本操作が実行されます。{print $0}

答え2

gawkでは、これら2つの参照はマニュアルから問題を説明してください。

ジョブは、中括弧( '{…}')で囲まれた1つ以上のawkステートメントで構成されています。各ステートメントは、実行するアクションを1つずつ指定します。ステートメントは改行またはセミコロンで区切られます。

セミコロンは「仕切り「しかし」ターミネーター".
ジョブに有効な唯一の終端は、閉じ括弧 ( }) です。

したがって、ジョブを閉じる中括弧()の}後には、他の内容が続く必要があります。モード{アクション}

「男」から「awkが何をすべきかを明確にするのに役立つかもしれないいくつかの異なる説明があります。

ステートメントは改行文字、セミコロン、またはその両方で終了します。ステートメントグループ(タスクやループ本体など)は、Cと同様に{...}でブロックされます。ブロックの最後のステートメントには終端子は必要ありません。

男性ノック「こう説明しました。

まずパターンを決めて、次に行動をとりましょう。演算文は{と}で囲まれています。

そして、詳細を知りたい場合は、POSIXの説明を読む:

action           : '{' newline_opt                             '}'
                 | '{' newline_opt terminated_statement_list   '}'
                 | '{' newline_opt unterminated_statement_list '}'
                 ;

「終了していない」ステートメントのリストが何であるかを検索します。

または、簡単に検索してみてください。行動読む:

すべての単一ステートメントは、中括弧で囲まれたステートメントのリストに置き換えることができます。アプリケーションは、ステートメントリストのステートメントが<newline>または<semicolon>文字で区切られていることを確認する必要があります。

再:are separated by <newline> or <semicolon> characters

答え3

条件付きブロック間のセミコロンはオプションのようです。ステートメントの間にはセミコロンのみがあります。以内にブロックは必須のようです。

$ echo -e "foo\nbar" | gawk '/foo/ { print "foo found" } /bar/ {print "bar found"}'
foo found
bar found
$ echo -e "foo\nbar" | gawk '/foo/ { print "foo found" }; /bar/ {print "bar found"}'
foo found
bar found
$ echo -e "foo\nbar" | gawk '/foo/ { print "foo found"; print "whee" }'
foo found
whee
$ echo -e "foo\nbar" | gawk '/foo/ { print "foo found" print "whee" }'
gawk: cmd. line:1: /foo/ { print "foo found" print "whee" }
gawk: cmd. line:1:                           ^ syntax error

ただし、2つの条件間の実際のコードブロックがデフォルト値のために省略されている場合は、{print}セミコロンが必要です(例:

$ echo -e "foo\nbar" | gawk '/foo/ /bar/'
gawk: cmd. line:2: /foo/ /bar/
gawk: cmd. line:2:            ^ unexpected newline or end of string
$ echo -e "foo\nbar" | gawk '/foo/; /bar/'
foo
bar

関連情報