「Awk」の版間の差分

提供: Wikinote
移動: 案内検索
(覚え書き)
(その他)
行48: 行48:
 
* 変数の初期化は不要
 
* 変数の初期化は不要
 
* <code>print $1 $2</code> で連結出力、カンマ区切りでスペース (OFS で変更)
 
* <code>print $1 $2</code> で連結出力、カンマ区切りでスペース (OFS で変更)
* <code>{ print $0; } = { print; }</code>
+
* <code>{ print $0 } = { print } = </code>
 +
** 要するに、<code>grep hoge = awk 'hoge'</code>
 
* -f program で自作ライブラリを複数取り込める
 
* -f program で自作ライブラリを複数取り込める
 
* $n (n > 0) を書き換えると、$0 も書き換わる
 
* $n (n > 0) を書き換えると、$0 も書き換わる

2009年6月16日 (火) 21:02時点における版

手軽さとパワーのバランスが素晴らしい AWK について。

ちなみに、AWK の A は、(オレの好きな) かの有名な Aho-Corasick 法を作った Aho 氏の A である!K はカーニハン。そりゃいい言語だわな。

参考文献

覚え書き

基本構文

gawk [-F sep] 'command' [file ...]

セパレータ (デリミタ) は -D ではなく、-F で指定することに注意。

組み込み変数

  • FS ― フィールドセパレータ (デフォルトはスペース)
  • NR ― 現レコード数
  • NF ― フィールド数
  • OFS ― 出力フィールドセパレータ (print のカンマ区切りのセパレータ; デフォルトはスペース)
  • ORS ― 出力レコードセパレータ (デフォルトは改行)

演算子

  • ~ ― 正規表現にマッチしたら真 ($0 ~ /re/)

他はほぼ C と同じ

制御構文

  • break, continue ― for や while の中で使う
  • next ― 次のレコードへ処理を移す
  • exit ― 残りのレコードは見ないで処理を中断 (END の中は実行されるので注意)

配列

  • array[i] ― 一次元配列
  • array[i,j,k] ― 三次元配列
  • array[str] ― 連想配列
    • for (x in array) { ... } ですべてのキーを取り出し可能
    • if (str in array) { ... } でキー str があるかどうか
    • array[str] = array[str] "hoge" で連結可能

関数

関数定義は function で行う。ローカル変数は以下のように引き数とはスペースで少し離して記載する。

function name (param1, param2,             local) {
     body-of-function
}
  • 配列は参照渡しになる (関数の中で書き換え可能)

その他

  • 変数の初期化は不要
  • print $1 $2 で連結出力、カンマ区切りでスペース (OFS で変更)
  • { print $0 } = { print } =
    • 要するに、grep hoge = awk 'hoge'
  • -f program で自作ライブラリを複数取り込める
  • $n (n > 0) を書き換えると、$0 も書き換わる
  • $(n) で入力レコードを変数で指定できる。

つまり、以下のように for で回すことが可能。

for (i = 1; i <= NF; i++) {
    print $(i)
}

サンプルスクリプト

Wiki 用に空白を挿入する

Wiki では、行が空白から始まっていると、以下のように固定幅フォントでタイプした通りに表示される。

ソースや出力結果などは通常これを用いる。

いちいち手作業で空白を入れるのは面倒なので (vim で C-v I はまあ許せるとして) gawk スクリプトにする。これはお手軽。

[hagio@localhost hagi_utils]$ cat addspace.gawk | ./addspace.gawk 
 #!/bin/gawk -f
 {
        print " " $0
 }

ただ、コマンド行はスペースが入らないので注意すること。>自分