awk関数一覧

タグ: awk   gawk  

awkでよく使用される組み込み関数を一覧にまとめます。使用機会の少ないだろうビット操作や国際化関数などは省略します。公式ドキュメントを参照してください。

ファイル操作はawkではclose以外関数ではなく、実行文のため、別途まとめます。

現状確認してみましたが、asortのソート方法の指定などは、日本語に翻訳して紹介しているサイトは現在ありません。リライトや単にまとめるかた、転載しないでください。ばれますよ。

文字列操作

関数 説明
gensub(正規表現, 置換後文字列, 方法 [, 対象]) 置換。戻り値が置き換え後の文字列で、非破壊的。
gsub(正規表現, 置換後文字列 [, 対象]) 置換。対象を置き換える破壊的。一致するもの全部を置換。
sub(正規表現, 置換後文字列 [, 対象]) 置換。対象を置き換える破壊的。最初に一致するものを置換。
match(文字列, 正規表現 [, 結果配列]) 一致の判定。
length([文字列]) 文字列長を返す。
index(対象, 検索文字列) 最初に検索文字列と一致したのが何番目かを返す。不一致時は0。
substr(文字列, 開始位置 [, 長さ ]) 開始位置と長さで、部分文字列を切り出す。
tolower(文字列) 小文字にする。
toupper(文字列) 大文字にする。
strtonum(文字列) 数値表現の文字列を数値にする。
patsplit(対象, 配列 [, フィールド正規表現 [, セパレーター配列 ] ]) フィールドの正規表現に一致する部分を配列に切り分ける。
split(対象, 配列 [, フィールドセパレーター [, セパレーター配列 ] ]) セパレーターで分割した部分を配列に切り分ける。
sprintf(フォーマット, エクスプレッション1, …) 出力の整形。

gensubgsubsubの置換関数では、対象を省略時は$0が対象となる。置換後文字列に含まれる&は一致した文字列と置き換わる。&文字自体に置き換えたい場合は、\\\\&とエスケープする必要がある。

gensub関数の方法は、Ggが全置換、数値の場合はその個数分置換する。

match関数は不一致時に0(論理判定時は偽)を返す。結果配列の[0]は正規表現全体に一致した文字列、[1]は最初のグルーピング(括弧間の正規表現)に一致した文字列…となる。

split関数はセパレーターに基づいて文字列を分割するのに対し、patsplit関数はフィールド部分を定義する正規表現に基づいて分割する。

strtonum関数の文字列が、0で開始する場合は8進数、0x0Xで開始する場合は16進数として変換する。

配列操作

公式ドキュメントでは文字列操作関数に含まれている。

関数 説明
asort(対象配列 [, ソート結果配列 [, ソート方法 ] ]) 配列の値でソートする。
asorti(対象配列 [, ソート結果配列 [, ソート方法 ] ]) 配列のキーでソートする。

asort関数は配列要素の値を、asorti関数は配列要素に対するインデックスを結果配列の値にする。

$ awk 'BEGIN { a["aaa"]="555"; a["ccc"]="111"; a["bbb"]="333"; asort(a,b); for(i in b){ print b[i];}}'
111
333
555

$ awk 'BEGIN { a["aaa"]="555"; a["ccc"]="111"; a["bbb"]="333"; asorti(a,b); for(i in b){ print b[i];}}'
aaa
bbb
ccc

ソート方法指定時は、その方法でソートを行う。asort関数は配列要素の値を、asorti関数は配列要素に対するインデックスを結果配列の値にする。(下の例では、ソート方法に"@unsorted"を指定し、ソートさせていないため、登録順そのままの結果となる。)

$ awk 'BEGIN { a["aaa"]="555"; a["ccc"]="111"; a["bbb"]="333"; asort(a,b,"@unsorted"); for(i in b){ print b[i];}}'
555
111
333

ソート方法の指定方法は2通りある。一つ目は、比較のためのユーザー定義関数名を渡す方法。その場合のユーザー定義比較関数は次のようになる。

# i1 :値1のインデックス
# v1 :値1
# i2 :値2のインデックス
# v2 :値2
function comp_func(i1, v1, i2, v2)
{
    # 戻り値が0より小さい : 2つ目の要素が、1つ目より前
    # 戻り値が0 : 両方の要素は等値なので、相対順序は不定
    # 戻り値が0より大きい : 1つ目の要素が、2つ目より前
    # return < 0 か 0 か > 0
}

2つ目のソート方法指定方法は、awk既定の方法を指定する方法である。

比較方法 説明
@unsorted ソートしない。
@ind_str_asc インデックス順に文字列として比較し、昇順にソートする。
@ind_num_asc インデックスを数値として扱い、比較し、昇順にソートする。数値が含まれないインデックス値は0として位置づけされる。
@val_type_asc 要素の値により昇順にソートする。数値は文字列より前になる。
@val_str_asc 要素の値により昇順にソートする。スカラー値は文字列として比較される。
@val_num_asc 要素の値により昇順にソートする。スカラー値は数値として比較される。数値が等しい場合、文字列順。
@ind_str_desc @ind_str_ascの降順バージョン。
@ind_num_desc @ind_num_ascの降順バージョン。
@val_type_desc @val_type_ascの降順バージョン。
@val_str_desc @val_str_ascの降順バージョン。
@val_num_desc @val_num_ascの降順バージョン

公式ドキュメントを参照し、大まかに説明を訳した。間違いが含まれている可能性がある。自分で動作をしっかり確認しない限り転載禁止。誤りがあった場合、拡散してしまうため。

算術関数

関数 説明
int(x) 小数点以下を切り捨てて、整数へ丸める。
sin(x) sinを求める。xはラジアン。
cos(x) cosを求める。xはラジアン。
atan2(y, x) y/xをラジアンとしてarctanを求める。
esqrt(x) 正数の平方根を求める。
xp(x) e ^ xを求める。
log(x) 自然対数を求める。
rand() 0から1の間の乱数を求める。 0になり得るが、1にはならない。
srand([x]) rand()で生成する乱数のシードを指定する。

rand()関数は、srand()関数で初期化しないと、毎回同じ乱数を生成する。つまり、通常の使用では初期化必須である。

srand()関数には乱数のシード値を指定するが、無指定の場合は実行時の日時が指定される。

rand()の生成値は、awkの実装により異なるため、異なったawk間で同値が生成されることを期待してはいけない。