はじめに

awk は、フィルタリングやテキスト抽出だけでなく、算術演算も実行できる強力なテキスト処理言語です。列の合計、平均値の計算、出現回数のカウントなどを行えるため、コマンドラインから直接レポートや統計情報を作成できます。

これが、awk が何十年にもわたって使われ続けている理由の一つです。運用作業では、テキストファイルを使った簡単なレポート作成が必要になることが多く、awk なら表計算ソフトや別のプログラミング環境を用意せずに対応できます。

この実験では、awk を使って次のことを学びます。

  1. 変数を初期化する:BEGIN ブロックを使って初期値を設定します。
  2. 計算を実行する:各行の値を加算して累計を作成します。
  3. 最終結果を出力する:END ブロックを使って合計や集計結果を出力します。
  4. 条件付きでカウントする:特定の条件を満たす行だけを数えます。

変数を初期化する

計算を始める前に、変数を初期化することがよくあります。awk では、BEGIN ブロックがすべての行を処理する前に一度だけ実行されるため、変数の初期化に適しています。

そのため、BEGIN はカウンターや合計値、見出しなどを設定する準備処理に自然に使えます。他のプログラミング言語における初期化コードと同じ役割を果たします。

データファイル data.txt の内容を確認します。

cat data.txt

このファイルには、Item($1)と Quantity($2)という 2 つの列があります。

total という変数を作成し、0 に設定します。

次のコマンドを実行してください。

awk 'BEGIN { total=0; print "Calculator ready. Total is initialized to:", total }' data.txt

動作の流れ:

  1. awk が BEGIN ブロックを実行します。
  2. 変数 total を 0 に設定します。
  3. メッセージを出力します。
  4. BEGIN ブロックの後にメインコードブロックがないため、そこで処理を終了します(厳密には、ファイルを処理できる状態にはなっています)。

列を合計する

次に、ファイルを処理します。数量を表す 2 列目($2)の値を合計します。

awk が読み取る各行について、$2 の値を変数 total に加算します。

加算代入の構文は total += $2 です。これは total = total + $2 を短く書いたものです。

ここで、awk は単なる列の表示ツールではなくなります。ファイルを処理しながら状態を保持できるため、各行のデータをそのまま出力するだけでなく、累計や集計結果を段階的に作成できます。

1 行ずつ計算が進む様子を確認するため、次のコマンドを実行してください。

awk 'BEGIN { total=0 } { total += $2; print "Added", $1, "("$2") - Current Total:", total }' data.txt

処理の流れ:

  • BEGIN:total を 0 に初期化します。
  • メインループ:各行について、数量($2)を total に加算し、その時点の状態を出力します。

各項目を処理するたびに、合計値が増えていくことを確認できます。

最終結果を出力する

通常は、途中経過ではなく最終的な合計だけを確認したい場合が多いでしょう。

その場合は END ブロックを使います。このブロックは、すべての行の処理が完了した後に 一度だけ 実行されます。

awk スクリプトは、多くの場合、準備処理を行う BEGIN、レコードごとの処理を行うメインブロック、最終レポートを出力する END という 3 つの段階で構成されます。この構造を理解することは、awk を効果的に使ううえで特に重要です。

整理した次のコマンドを実行してください。

awk 'BEGIN { total=0 } { total += $2 } END { print "Final Total Quantity:", total }' data.txt

処理の内訳:

  1. BEGIN:total を 0 に設定します。
  2. { ... }:ファイルを読み取り、各行の $2 を total に加算します。この処理では途中経過を出力しません。
  3. END:ファイルの末尾に到達したら、total の最終値を出力します。

出力は Final Total Quantity: 22 になります。

条件付きでカウントする

すべての値を単純に合計するのではなく、条件に基づいて出現回数を数えたい場合があります。

たとえば、「在庫数量が 4 より多い項目はいくつあるか」を調べる場合です。

  1. カウンターを初期化します(count = 0)。
  2. 各行を確認します:if ($2 > 4)。
  3. 条件が真の場合、カウンターを 1 増やします:count++。
  4. END ブロックで結果を出力します。

この例では、awk がファイルを 1 回処理する間に、解析、条件判定、算術演算を組み合わせています。そのため、多くの運用レポートでは、別の言語で専用プログラムを作成する必要がありません。

カウント用のコマンドを実行してください。

awk 'BEGIN { count=0 } { if ($2 > 4) count++ } END { print "Items with quantity > 4:", count }' data.txt

結果は 2 になります(Apple と Cherry)。

処理を組み合わせることもできます。次のコマンドは、4 より大きい値 だけ を合計します。

awk 'BEGIN { sum=0 } { if ($2 > 4) sum += $2 } END { print "Sum of quantities > 4:", sum }' data.txt

合計は 13 です(5 + 8)。

まとめ

この実験では、awk を使った計算と統計処理について学びました。

  1. BEGIN ブロック:処理を開始する前に変数を初期化します。
  2. 算術演算(+=):行ごとに列を合計するなどの計算を実行します。
  3. 条件分岐(if):特定の条件を満たす場合だけ処理を実行します(例:条件付きのカウント)。
  4. END ブロック:ファイル処理が完了した後に最終結果を出力します。

これらの機能を使うと、ターミナルから直接テキストファイルの高度な集計結果や指標を作成できます。