言語仕様

主にPOSIX仕様について記すが、今のところググった結果を貼り付けたものも混ざっている。

Specs

下に記載のないもの。

演算子

参考:

Patterns

awk - POSIX#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

awk - POSIX#Actions

next

以降の処理を全て破棄して、次のレコードを処理する。
他言語でもよくあるループ構文の next に似ている。

Examples:

NR < 3 { next }  # 1-2行目は処理しない
/^#/   { sub("^# ?", ""); print; next } # "^# ?" を取り除いて出力し、次のレコードへ
       { exit }  # /^#/ にマッチしなくなったら終了

exit

ループ処理を中断してENDブロックに飛ぶ。

参考:

文字列関数

awk - POSIX#String Functions

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)) {
    # ...
  }
}