文書の過去の版を表示しています。
awk
概要
- プログラミング言語の1つ
- 特定の文字で区切られたデータが記述されたテキストを処理する際に便利
- 現在の Linux ディストリビューションで使える awk の実体は awk ではなく、gawk (awk は gawk のリンクになっている)
処理の流れ
- 1行ずつ処理していく
- 以下の順にプログラムは進む
- 前処理: BEGIN{…}
- 省略可
- 本処理: {…}
- {…} の前にパターン (正規表現可) をつけると、パターンの行のみ処理する
- 後処理: END{…}
- 省略可
- awk にはファイル保存機能はないため、リダイレクトやパイプを使ってデータを保存したり、渡したりする
実行方法
- ワンライナー
$ awk [オプション] '処理内容' データ
- バッチファイル1 (awk に読み込ませる)
$ awk [オプション] -f バッチファイル データ
- バッチファイルとは awk の処理内容を記述したファイル
- バッチファイル2 (単体で動かす)
$ chmod +x バッチファイル $ ./バッチファイル データ
- ただし、バッチファイルの先頭に
#!/usr/bin/awk -f
を付けること (/usr/bin/awk は環境によって異なるので、which コマンドなどで確認すること)
- パイプデータ処理
$ コマンド | awk [オプション]
オプション
表記 | 効果 | 備考 |
---|---|---|
-F 区切り文字 | 区切り文字(入力フィールドセパレータ)の変更 | |
-v 変数名=変数値 | awk 内に変数を渡す | シェル内での実行の際、シェル変数を awk に渡したい時に使う |
-f バッチファイル | バッチファイルに記述した処理をする |
用語
- レコード: 入力レコードセパレータで分割されたデータ
- フィールド: フィールドセパレータで分割されたデータ
構文
全体のコード
#!/usr/bin/awk BEGIN{ 開始処理 } /正規表現パターン1/{ パターン1に対する処理 } /正規表現パターン2/{ パターン2に対する処理 } : END{ 終了処理 }
変数
- 変数
- $0: レコード (行全体)
- $1, $2, $3, …: フィールドの各データ
- 変数は自分で定義することも可能
- よく使う組み込み変数
- FS: 区切り文字 (データ間を区切る文字)
- オプション
-F 区切り文字
で変更可 (区切り文字は正規表現での表現可)
その他
- 改行
- 複数行を1行にしたい(ワンライナー)場合、「;」が改行の代わりになる
関数
- よく使う関数
- print
- 変数の中身などを出力
- print の後に括弧を付けない
- 複数のデータを表示する場合は、スペースで区切って列挙 (例: print $1 "\t" $2 $3)
- スペースやタブを出力したい場合は、
“ ”
や“\t”
を変数の間に入れる
演算子
- 演算
- 四則演算が使える
- +, -, *, /
- インクリメンタル (++) やデクリメント (–) が使える
- 代入演算子 (+= や -= など) が使える
awk プログラムの例
合計と平均算出
- 対象データ: 第1フィールドにステップ数、第2フィールドに値があるデータ
- コード (バッチファイル)
- sumaverage.awk
#!/usr/bin/awk -f BEGIN{ total = 0 count = 0 } $0 !~ /^#/{ total += $2 count ++ } END{ average = total / count print "Total: " total print "Average: " average }
$ awk -f sumaverage.awk data.txt
or
$ chmod +x sumaverage.awk $ ./sumaverage.awk data.txt
- コード (ワンライナー)
$ awk 'BEGIN{total = 0; count = 0} $0!~/^#/{total += $2; count ++} END{average = total / count; print "Total: " total; print "Average: " average}'