言語仕様
主にPOSIX仕様について記すが、今のところググった結果を貼り付けたものも混ざっている。
Specs
下に記載のないもの。
演算子
参考:
Patterns
AWKの基本構文である <pattern> { <action> }
の <pattern>
について。
種類:
- 単一のパターン
- 2つのパターンを
PATTERN1,PATTERN2
のようにカンマ区切りで記したレンジ - 特殊パターン:
BEGIN
,END
Expression Patterns
Booleanコンテキストで評価できる任意の表現を利用できる。
(レコードが)真と評価されればマッチしたと見なされ、アクションが実行される。
Examples:
NR < 3 { ... } # 1-2行目にマッチ
NR % 2 == 0 { ... } # 偶数行にマッチ
$2 == 'F' { ... } # 第2フィールドが 'F' だったらマッチ
Pattern Ranges
2つの評価式をカンマ区切りで記すことでレンジを表現する。
- 1つ目の条件にマッチした後、2つ目の条件にマッチするまでアクションが実行される
- 両端のレコード(1つ目と2つ目の条件に最初にマッチした行)もアクションの対象となる
Examples:
NR==2,NR==5 { ... } # 2-5行目にマッチ
NR==3,/^$/ { ... } # 3行目から最初の空行までマッチ
制御構文
リファレンス:
if, elseのサンプル:
{
if (a && b || c) {
# ...
} else if ($1 ~ /foo/) {
# ...
} else {
# ...
}
}
その他使える構文:
- for
- while, do … while
Spec:
- 制御構文(break, continue含む)はC言語に由来している
- 真偽判定:
- 数値の場合、0は偽、他は真
- 文字の場合、ヌル文字は偽、他は真
- if, else等で実行される文が単文の場合、中括弧は省略可
参考:
Actions
next
以降の処理を全て破棄して、次のレコードを処理する。
他言語でもよくあるループ構文の next
に似ている。
Examples:
NR < 3 { next } # 1-2行目は処理しない
/^#/ { sub("^# ?", ""); print; next } # "^# ?" を取り除いて出力し、次のレコードへ
{ exit } # /^#/ にマッチしなくなったら終了
exit
ループ処理を中断してENDブロックに飛ぶ。
参考:
文字列関数
Tips:
- 関数引数が
$0
のときは省略できることが多いようだ
sub, gsub
sub(ere, repl[, in])
gsub(ere, repl[, in])
文字列置換を行う。
in中のereという正規表現パターンをreplに置換する。
repl内では &
でマッチした文字列を参照できるみたい。
inを省略した時には $0
が対象になる。
subは最初に出現したパターンを1回だけ置換。
gsubは出現した全パターンに置換を適用する。
参考:
文字列操作
文字列の連結
単純にスペースでつなぐ。
awk '{print $1 "-" $2 "-" $3}' sample.tsv
参考:
パターンマッチ
{
regexp = ".*\.sh$"
if (/^[abc]+/) { # $0 にマッチ
# ...
} else if ($1 ~ regexp) {
# ...
} else if (match($2, regexp)) {
# ...
}
}
最終更新 2020-07-21: [awk] About pattern ranges & next (384b3be7c)