awk
『awk』はテキストをフィールド(列)単位で処理するプログラミング言語です。CSVやログファイルの集計・抽出・変換など、構造化テキストの処理で強力な能力を発揮します。
構文
awk [オプション] 'プログラム' [ファイル...]
awk -F 区切り文字 'プログラム' [ファイル...]
構文・変数一覧
| 構文 / 変数 | 概要 |
|---|---|
| '{print $1}' | 1番目のフィールドを表示します($0 は行全体)。 |
| -F ':' | フィールド区切り文字を指定します(デフォルトは空白)。 |
| NR | 現在処理中の行番号です。 |
| NF | 現在行のフィールド数です。$NF で最後のフィールドを参照できます。 |
| FS | フィールド区切り文字(Field Separator)です。 |
| OFS | 出力フィールド区切り文字(Output Field Separator)です。 |
| RS | レコード区切り文字(Record Separator、デフォルトは改行)です。 |
| BEGIN { } | ファイルを読む前に1度だけ実行されるブロックです。 |
| END { } | ファイルを読み終えた後に1度だけ実行されるブロックです。 |
| /パターン/ { } | パターンに一致する行にのみ処理を適用します。 |
サンプルコード
以下のファイルを例に説明します。
scores.txt
alice 85 Tokyo bob 92 Osaka charlie 78 Tokyo diana 95 Nagoya eve 88 Osaka
sales.csv
name,amount,region alice,1200,east bob,800,west charlie,1500,east
各行の1番目のフィールドを表示します。
awk '{print $1}' scores.txt
alice
bob
charlie
diana
eve
条件を指定して、2列目が90以上の行のみ表示します。
awk '$2 >= 90' scores.txt bob 92 Osaka diana 95 Nagoya
条件に一致した行の特定フィールドだけを表示します。
awk '$2 >= 90 {print $1, $2}' scores.txt
bob 92
diana 95
『NR』で行番号付きで表示します。
awk '{print NR": "$0}' scores.txt
1: alice 85 Tokyo
2: bob 92 Osaka
3: charlie 78 Tokyo
4: diana 95 Nagoya
5: eve 88 Osaka
『END』ブロックで数値を合計します(2列目を合計)。
awk '{sum += $2} END {print "Total:", sum}' scores.txt
Total: 438
『-F』で区切り文字を指定してCSVを処理します。
awk -F',' '{print $1, $2}' sales.csv
name amount
alice 1200
bob 800
charlie 1500
『BEGIN』と『END』を使ってヘッダー・フッターを付けます。
awk 'BEGIN{print "=== Results ==="} {print $1, $2} END{print "=== End ==="}' scores.txt
=== Results ===
alice 85
bob 92
charlie 78
diana 95
eve 88
=== End ===
パターンに一致する行を処理します(3列目が『Tokyo』の行のみ)。
awk '$3 == "Tokyo" {print $1, $2}' scores.txt
alice 85
charlie 78
連想配列を使って重複を除去します。
awk '{print $3}' scores.txt | awk '!seen[$0]++'
Tokyo
Osaka
Nagoya
概要
『$ awk』はシェル内で使える小さなプログラミング言語です。変数・条件分岐・ループ・配列・組み込み関数(gsub・split・substr・sprintf など)も使えます。複雑な処理は Python や Perl のほうが読みやすいですが、ワンライナーで済む集計・変換には awk が最速です。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。