この記事は、進行中の Awk チュートリアル サンプル シリーズの一部です。以前の awk 記事では、awk print、awk ユーザー定義変数、awk 組み込み変数、および awk 演算子について説明しました。
この awk チュートリアルでは、awk 条件付き if ステートメントを確認しましょう。
awk は、プログラムの流れを制御するための多くの条件文をサポートしています。 Awk の条件ステートメントの構文のほとんどは、「C」プログラミング言語に似ています。
通常、条件ステートメントは、アクションを実行する前に条件をチェックします。条件が true の場合、アクションが実行されます。同様に、条件が false の場合にアクションを実行できます。
条件文は「if」というキーワードで始まります。 Awk は 2 種類の if ステートメントをサポートしています。
<オール>Awk シンプルな If ステートメント
シングル アクション: 単純な If ステートメントを使用して条件をチェックし、条件が true を返す場合、対応するアクションを実行します。
Syntax: if (conditional-expression) action
- キーワードの場合
- 条件式 – 条件をチェックする式
- action – アクションを実行する任意の awk ステートメント
複数のアクション: 条件式が true を返す場合、アクションが実行されます。複数のアクションを実行する必要がある場合は、以下に示すようにアクションを中かっこで囲み、新しい行またはセミコロンで区切ります。
Syntax: if (conditional-expression) { action1; action2; }
条件が真の場合、中括弧で囲まれたすべてのアクションが指定された順序で実行されます。すべてのアクションが実行された後、次のステートメントを実行し続けます。
Awk If Else ステートメント
上記の単純な awk If ステートメントには、条件が false の場合の一連のアクションはありません。 awk If Else ステートメントでは、条件が false の場合に実行するアクションのリストを指定できます。条件が true を返す場合はアクション 1 が実行され、条件が false の場合はアクション 2 が実行されます。
Syntax: if (conditional-expression) action1 else action2
Awk には条件演算子、つまり 三項演算子 もあります ( ?:) その機能は awk If Else ステートメントに似ています。条件式が真の場合はアクション 1 が実行され、条件式が偽の場合はアクション 2 が実行されます。
Syntax: conditional-expression ? action1 : action2 ;
Awk If Else If はしご
if(conditional-expression1) action1; else if(conditional-expression2) action2; else if(conditional-expression3) action3; . . else action n;
- 条件式 1 が真の場合、アクション 1 が実行されます。
- 条件式 1 が偽の場合、条件式 2 がチェックされ、真の場合、アクション 2 が実行され、このように続きます。条件式が真でない場合、最後の else 部分が実行されます。
それでは、生徒の採点を含むサンプル入力ファイルを作成しましょう。
$cat student-marks Jones 2143 78 84 77 Gondrol 2321 56 58 45 RinRao 2122 38 37 Edwin 2537 87 97 95 Dayan 2415 30 47
1. Awk If 例:すべてのマークが存在することを確認します
$ awk '{ if ($3 =="" || $4 == "" || $5 == "") print "Some score for the student",$1,"is missing";' }' student-marks Some score for the student RinRao is missing Some score for the student Dayan is missing
$3、$4、$5 は生徒のテストの点数です。テスト スコアが空の場合、メッセージがスローされます。 ||オペレーターは、マークのいずれかが存在しないことを確認し、警告する必要があります。
2. Awk If Else の例:各科目の生徒の成績に基づいて合格/不合格レポートを生成する
$ awk '{ if ($3 >=35 && $4 >= 35 && $5 >= 35) print $0,"=>","Pass"; else print $0,"=>","Fail"; }' student-marks Jones 2143 78 84 77 => Pass Gondrol 2321 56 58 45 => Pass RinRao 2122 38 37 => Fail Edwin 2537 87 97 95 => Pass Dayan 2415 30 47 => Fail
合格の条件は、すべてのテスト スコア マークが 35 以上であることです。したがって、すべてのテスト スコアが 35 より大きい場合にチェックされ、行全体と文字列「合格」が出力されます。テストのスコアが条件を満たさない場合、行全体が出力され、文字列「Fail」が出力されます。
3. Awk If Else If 例:すべての生徒の平均と成績を求める
$ cat grade.awk { total=$3+$4+$5; avg=total/3; if ( avg >= 90 ) grade="A"; else if ( avg >= 80) grade ="B"; else if (avg >= 70) grade ="C"; else grade="D"; print $0,"=>",grade; } $ awk -f grade.awk student-marks Jones 2143 78 84 77 => C Gondrol 2321 56 58 45 => D RinRao 2122 38 37 => D Edwin 2537 87 97 95 => A Dayan 2415 30 47 => D
上記の awk スクリプトでは、「avg」という変数に 3 つのテスト スコアの平均が含まれています。平均が 90 以上の場合、グレードは A、平均が 80 以上の場合、グレードは B、平均が 70 以上の場合、グレードは C です。それ以外の場合、グレードは D です。
4. Awk Ternary ( ?:) 例:入力の 3 行ごとにカンマで連結します。
$ awk 'ORS=NR%3?",":"\n"' student-marks Jones 2143 78 84 77,Gondrol 2321 56 58 45,RinRao 2122 38 37 Edwin 2537 87 97 95,Dayan 2415 30 47,
前に awk ORS 組み込み変数について説明しました。この変数は、出力を取得するすべての行の後に追加されます。この例では、3 行ごとにコンマから改行に変更されます。 1、2 行目はコンマ、3 行目は改行、4、5 行目はコンマ、6 行目は改行などです。
推奨読書
<強い> 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 ユーティリティの機能に驚かれることでしょう。