「Awk」の版間の差分
提供: Wikinote
細 (→その他) |
(→覚え書き) |
||
行36: | 行36: | ||
** <code>if (str in array) { ... }</code> でキー str があるかどうか | ** <code>if (str in array) { ... }</code> でキー str があるかどうか | ||
** <code>array[str] = array[str] "hoge"</code> で連結可能 | ** <code>array[str] = array[str] "hoge"</code> で連結可能 | ||
+ | |||
+ | === 関数 === | ||
+ | 関数定義は function で行う。ローカル変数は以下のように引き数とはスペースで少し離して記載する。 | ||
+ | function name (param1, param2, local) { | ||
+ | body-of-function | ||
+ | } | ||
+ | |||
+ | * 配列は参照渡しになる (関数の中で書き換え可能) | ||
=== その他 === | === その他 === | ||
行41: | 行49: | ||
* <code>print $1 $2</code> で連結出力、カンマ区切りでスペース (OFS で変更) | * <code>print $1 $2</code> で連結出力、カンマ区切りでスペース (OFS で変更) | ||
* <code>{ print $0; } = { print; }</code> | * <code>{ print $0; } = { print; }</code> | ||
− | |||
* -f program で自作ライブラリを複数取り込める | * -f program で自作ライブラリを複数取り込める | ||
* $n (n > 0) を書き換えると、$0 も書き換わる | * $n (n > 0) を書き換えると、$0 も書き換わる |
2009年6月12日 (金) 07:50時点における版
手軽さとパワーのバランスが素晴らしい AWK について。
ちなみに、AWK の A は、(オレの好きな) かの有名な Aho-Corasick 法を作った Aho 氏の A である!K はカーニハン。そりゃいい言語だわな。
目次
参考文献
- The GAWK Manual (2.15.6)
- AWK Language Programming (3.0.4)
覚え書き
基本構文
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; }
- -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 }
ただ、コマンド行はスペースが入らないので注意すること。>自分