Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
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 が最速です。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。