Linux / コマンド / awk - フィールド別テキスト分析と計算

awkは入力をレコードとフィールドに分け、条件に合った値を出力または計算します。列抽出、ログ集計、簡単なレポート作成に便利です。

デフォルトでは1行を一つのレコードとして扱い、連続するスペースやタブでフィールドを区切ります。行頭・行末の空白はフィールドとして数えません。現在の行全体は$0、最初のフィールドは$1、フィールド数はNF、累計行番号はNRとして参照します。入力に応じて-Fで区切り文字を指定してください。

基本的な文法

awk [オプション] 'パターン { 動作 }' [ファイル ...]

インストールされている実装とオプションは、配布版によって異なる場合があります。man awkで現在のシステムの説明を確認してください。

使用例

2番目のフィールドを出力

読み取れる report.txt に、空白で区切られたデータを用意します。以下では必要なフィールドだけを選びます。

awk '{ print $2 }' report.txt

条件に合った行

3番目のフィールドが数値のデータを対象に、値が100より大きい行から名前と数値を出力します。

awk '$3 > 100 { print $1, $3 }' report.txt

合計計算

amounts.txt の各行に名前と数値を用意します。2番目のフィールドを足し、入力が終わったら合計を出力します。

awk '{ total += $2 } END { print total }' amounts.txt

フィールド条件で行を選ぶ

awkは基本的に連続した空白をフィールド区切りとして解釈します。$2は2番目のフィールドで、条件が真の行で$1を出力できます。

printf 'Ana 12\nBob 7\n' | awk '$2 >= 10 {print $1}'

例の出力:

Ana

2番目の行の値7は条件を満たさないので除外されます。列がタブやコロンなど特定の文字で区切られている場合は-Fで区切り文字を指定してください。空白を含むCSV引用フィールドや複雑なエスケープを処理するには、CSV専用のパーサを使う方が安全です。

合計のような集計は、行ごとに状態を累積し、最後に出力します。例えばawk '{sum += $2} END {print sum}' ファイルは2番目のフィールドの合計を求めます。入力が数字でない文字列の場合は期待と異なる結果になる可能性があるため、データ形式と欠損フィールドをまず確認してください。

主なオプションと形式

オプション・形式 説明
-F 区切り文字 入力フィールドの区切りを指定します。値によっては正規表現として解釈されます。
-v 名前=値 awk変数の初期値を渡します。
BEGIN 最初の入力行を読む前に実行されるパターンです。
END 最後の入力行を処理した後に実行するパターンです。

使用する際の注意点

awk -F,は引用符の中にカンマが入ったCSVを正しく解析できません。入力がCSVであれば、専用のパーサーを使用してください。GNU gawk 専用機能は他のawk実装では動作しない場合があります。awk ... file > file は読み取り前に元ファイルを空にするため、出力は別名で保存して確認します。文字列の置換が主目的なら sedの検索・置換 も適しています。

よくある質問

awkの$0と$1は何が違うのですか?

$0は現在のレコード全体、$1は最初のフィールドです。

公式ドキュメント

オプションの正確な動作と実装ごとの差異は、awk関連の公式ドキュメントで確認できます。