はじめに
テキストデータの集計作業は、エンジニアにとって避けて通れない作業のひとつです。特にログや数値データを扱う場面では、「合計」を素早く求めたいケースが頻繁にあります。そこで活躍するのがawkコマンドです。awkを使えば、複雑なプログラムを書かなくてもシンプルな記述で効率よく合計処理ができます。
本記事では、awk初心者の方でも理解できるように、基本的な合計の取り方から応用的な使い方まで丁寧に解説します。つまずきやすいポイントにも触れているので、実践しながら理解を深めていきましょう。
参考: GNU awk
awkで2列目の合計を計算する基本構造
今回使用するコマンドは以下です。
このコマンドは「2列目の値だけを順番に足し合わせて、最後に合計を表示する」という処理を行います。
| $2 | 2列目の値を取得 |
| sum += $2 | 値を変数sumに加算 |
| END {print sum} | すべての行を処理した後に合計を出力 |
awkでは、1行ずつ処理しながら値を蓄積していくのが基本の流れです。
実行前の状態(input.txt)
4 2 4
7 3 5
このようにスペース区切りで3列の数値が並んでいます。
実行後の状態(input.txtを使用)
5
2列目の「2」と「3」が合計され、結果は「5」になります。
実行画像

全列の合計
使用コマンド:
仕組みの解説
| NF | その行の列数 |
| for(i=1; i<=NF; i++) | 全列をループ |
| sum[i] += $i | 列ごとに配列で合計を管理 |
このコマンドにより、各列ごとの合計が計算されます。
出力例:
sum1:11 sum2:5 sum3:9
行ごとの合計
使用コマンド:
awk '{ sum = 0; for(i=1; i<=NF; i++) sum += $i } { printf "sum:%d\n", sum }' input.txt
仕組みの解説
| 行ごとにsumをリセット |
| 各列をループして足し算 |
| 行単位で合計を出力 |
出力例:
sum:10
sum:15
具体的な利用シーン
CSVファイルの集計(input.csv)
仕組み
| -F,で区切り文字をカンマに変更 |
| CSV形式でも列ごとの合計が可能 |
Apacheログのレスポンスサイズ合計(access_log)
例:access_log
127.0.0.1 - - [date] "GET /index.html HTTP/1.1" 200 512
127.0.0.1 - - [date] "GET /img.png HTTP/1.1" 404 256
127.0.0.1 - - [date] "GET /home HTTP/1.1" 200 1024
使用コマンド:
仕組み
| ステータスコード200を検出 |
| その直後のフィールド(レスポンスサイズ)を加算 |
不動小数点の合計(input.txt)
仕組み
| 小数を含む値も正確に合計 |
| %.2fで小数点2桁表示 |
失敗例
1. 列番号の指定ミス
$2の代わりに$3など誤った列を指定すると、意図しない合計になります。
2. 区切り文字を指定しない
CSVなのに-F,を指定しないと、正しく列が分割されません。
3. sumの初期化忘れ
行ごとの合計でsum = 0を忘れると、前の行の値が累積されてしまいます。
まとめ
awkを使った合計処理は、シンプルながら非常に強力です。基本を理解すれば、ログ解析やデータ処理の効率が大きく向上します。まずは今回のコマンドを実際に試しながら、徐々に応用へとステップアップしていきましょう。
