この記事は、進行中の Awk チュートリアル サンプル シリーズの一部です。以前の awk 記事では、awk print、awk ユーザー定義変数、awk 組み込み変数、awk 演算子、および awk 条件ステートメントについて説明しました。
この記事では、awk ループ についておさらいしましょう。 ステートメント – while、do while、for ループ 、break、continue、および exit ステートメントと 7 つの実用的な例を示します。
一連のアクションを連続して何度も実行するには、awk ループ ステートメントを使用します。条件が真である限り、ステートメントを繰り返し実行します。 Awk には、「C」プログラミング言語のように、多数のループ ステートメントがあります。
Awk While ループ
Syntax: while(condition) actions
- while はキーワードです。
- 条件は条件式です
- アクションは、1 つ以上のステートメントを持つことができる while ループの本体です。アクションに複数のステートメントがある場合は、中かっこで囲む必要があります。
仕組み — しばらくの間 ループは最初に条件をチェックし、条件が真の場合、アクションのリストを実行します。アクションの実行が完了したら、再度条件をチェックし、true の場合は再度アクションを実行します。このプロセスは、条件が false になるまで繰り返されます。最初の反復で条件が false を返す場合、アクションは実行されません。
1. Awk While ループの例:特定の長さの文字列を作成する
$awk 'BEGIN { while (count++<50) string=string "x"; print string }' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
上記の例では、Awk プログラムで他の何よりも先に実行される「BEGIN { }」特殊ブロックを使用しています。このブロックでは、awk while ループが文字「x」を変数「string」に 50 回追加します。 count はインクリメントされ、50 未満であることを確認する変数です。したがって、50 回の反復の後、この条件は false になります。
ループした後、「文字列」変数が出力されます。この Awk プログラムには本体がないため、BEGIN ブロックの実行後に終了します。
Awk Do-While ループ
仕組み – その間にやること ループは出口制御ループと呼ばれ、awk while ループは入口制御ループと呼ばれます。 while ループは最初に条件をチェックするため、本体を実行するかどうかを決定します。しかし、awk do while ループは本体を 1 回実行し、条件が真である限り本体を繰り返します。
Syntax: do action while(condition)
条件が false であっても、最初にアクションが少なくとも 1 回実行されます。
2. Awk Do While ループの例:メッセージを少なくとも 1 回出力する
$ awk 'BEGIN{ count=1; do print "This gets printed at least once"; while(count!=1) }' This gets printed at least once
上記のスクリプトでは、print ステートメントが少なくとも 1 回実行されます。while ステートメントを使用すると、最初にカウントが 1 に初期化された後に条件がチェックされ、最初の反復自体で条件が false になるため、print ステートメントは実行されません。 t は実行されますが、最初の本体が実行される間に do が実行されるため、print ステートメントを実行します。
Awk For ループ ステートメント
おっと ステートメントは awk while ループと同じですが、構文がはるかに使いやすくなっています。
Syntax: for(initialization;condition;increment/decrement) actions
仕組み — やばい ステートメントは初期化の実行から開始し、条件をチェックし、条件が true の場合はアクションを実行し、次にインクリメントまたはデクリメントします。その後、条件が true である限り、アクションの実行とインクリメント/デクリメントを繰り返します。
3. Awk For ループの例。すべての行のフィールドの合計を出力します。
$ awk '{ for (i = 1; i <= NF; i++) total = total+$i }; END { print total }' 12 23 34 45 56 34 56 23 45 23 351
最初に変数 i は 1 に初期化され、次に i がフィールドの総数以下かどうかをチェックし、すべてのフィールドを追加し続け、最後に追加が変数 total に格納されます。 END ブロックでは、変数の合計を表示するだけです。
4. Awk For ループの例:フィールドをすべての行で逆順に出力します。
$ awk 'BEGIN{ORS="";}{ for (i=NF; i>0; i--) print $i," "; print "\n"; }' student-marks 77 84 78 2143 Jones 45 58 56 2321 Gondrol 37 38 2122 RinRao 95 97 87 2537 Edwin 47 30 2415 Dayan
前回の記事で awk NF 組み込み変数について説明しました。各行を処理した後、Awk は NF 変数をその行で見つかったフィールド数に設定します。
上記のスクリプトは、NF から 1 まで逆順にループし、フィールドを 1 つずつ出力します。フィールド $NF で始まり、次に $(NF-1)、…、$1 です。その後、改行文字を出力します。
ループ文で使用できる他の文をいくつか見てみましょう。
Awk Break ステートメント
Break ステートメントは、それを囲む最も内側のループ (while、do-while、および for ループ) から飛び出すために使用されます。
5. Awk Break の例:10 回の反復のみを実行する Awk スクリプト
$ awk 'BEGIN{while(1) print "forever"}'
上記の awk while ループは、条件が決して失敗しないため、文字列「forever」を永久に出力します。最初の 10 回の反復後にループを停止する場合は、以下のスクリプトを参照してください。
$ awk 'BEGIN{ x=1; while(1) { print "Iteration"; if ( x==10 ) break; x++; }}' Iteration Iteration Iteration Iteration Iteration Iteration Iteration Iteration Iteration Iteration
上記のスクリプトでは、変数「x」の値をチェックし、10 に達したら、break ステートメントを使用してループから飛び出します。
Awk Continue ステートメント
Continue ステートメントは、ループ本体の残りをスキップして、ループの次のサイクルをすぐに開始します。
6. Awk Continue 例:5 回目の反復を除いてループを実行
$ awk 'BEGIN{ x=1; while(x<=10) { if(x==5){ x++; continue; } print "Value of x",x;x++; } }' Value of x 1 Value of x 2 Value of x 3 Value of x 4 Value of x 6 Value of x 7 Value of x 8 Value of x 9 Value of x 10
上記のスクリプトでは、反復ごとに x の値を出力しますが、x の値が 5 に達すると、x の値をインクリメントするだけで、次の反復を続行し、ループの残りの本体を実行しません。そのため、x の値は値 5 に対して出力されません。continue ステートメントは、ループ内で with を使用する場合にのみ意味を持ちます。
Awk Exit ステートメント
exit ステートメントにより、スクリプトは現在の入力の実行を即座に停止し、残りのすべての入力が無視される入力の処理を停止します。
Exit は、awk プロセスの終了ステータス コードとなる任意の整数を引数として受け入れます。引数が指定されていない場合、exit はステータス 0 を返します。
7. Awk 終了例:5 回目の繰り返しでループを終了
$ awk 'BEGIN{ x=1; while(x<=10) { if(x==5){ exit;} print "Value of x",x;x++; } }' Value of x 1 Value of x 2 Value of x 3 Value of x 4
上記のスクリプトでは、x の値が 5 に達すると、exit が呼び出され、awk プロセスの実行が停止されます。したがって、x の値は 4 までしか表示されず、5 に達すると終了します。
推奨読書
<強い> Ramesh Natarajan による Sed と Awk の 101 ハック .テキスト ファイル (データ、構成、およびログ ファイル) を扱う UNIX/Linux 環境で、1 日に数時間を費やしています。私はすべてのテキスト操作作業に Sed と Awk を使用しています。私の Sed と Awk の経験に基づいて、Sed と Awk のさまざまな高度な機能に関する 101 の実用的な例を含む Sed and Awk 101 Hacks eBook を作成しました。これにより、UNIX/Linux の生活が向上します。 Sed と Awk を数年間使用しており、この本をまだ読んでいない場合でも、ぜひこの本を読んでください。 Sed および Awk ユーティリティの機能に驚かれることでしょう。