Posted at

awkに関するメモ

More than 1 year has passed since last update.


awk


■ 特徴


  • Cに近い

  • 高速

  • awkだけで、処理を実装可能



■ 基本構文

awk パターン {アクション}'

cat text.txt | awk 'NR <= 4 && NR >=1 {value="test"; print $1}'

※ アクションがない場合は、そのまま表示
echo 100 | awk 1



■ 真偽値


  • 0 : False

  • 空文字 : False

  • 上記以外 : True

* TRUEの場合

# echo 100 | awk 1
100

* FALSEの場合
# echo 100 | awk 0

代入を行う際は、戻り値が左辺値になることに注意が必要。

※ 第2文字列を空文字にする処理

※ 戻り値は, $2になるので、$2がFalseだと表示されない
# echo "a b c" | awk '$2 = ""'

# echo "a b c" | awk '!($2 = "")'
a c



■ 組み込み変数


  • NF : フィルード(列)の数

  • NR : レコード(行)の数

  • FS : フィールドの区切り文字 (デフォルトは空白)

  • RS : レコードの区切り文字 (デフォルトは改行)

  • OFS : 出力するときのフィールドの区切り文字 (デフォルトは空白)

  • ORS : 出力するときのレコードの区切り文字 (デフォルトは改行)



■ 組み込み関数


  • substr(対象文字列, 切り出し開始文字位置, 切り出す文字数)

  • sub(置換対象文字列, 置換後文字列, 対象文字列)
    => 最初に検索にヒットした文字だけ

  • gsub(置換対象文字列, 置換後文字列, 対象文字列)
    => 検索にヒットした文字全て

  • index(文字列, 検索文字) => 検索文字位置

  • match(文字列, 正規表現) => 真偽値

    => RSTART : マッチした文字位置

    => RLENGTH : マッチした文字数


  • split() : 文字列から配列を作る、配列数を返す


  • patsplit() : パターンを指定して配列を作成


  • length(配列) => 配列の数


  • printf


echo "1 2 3"  | awk '{var = $2; printf("test %s test", var);}'


  • sprintf : 文字列を結合する

echo "1 2 3"  | awk '{var = $2; string=sprintf("test %s test", var); print string}'


  • fork : 並列処理

@load "fork";

BEGIN {
for (i = 1; i <= 3; i++) {
pid = fork();

# pid が 0 なら子プロセス
if (pid == 0) {
for (j = 1; j < 3; j++) {
print i j
}
}

}
}



■ 正規表現

パターンを/で囲む。

ps aux  | awk '/.+sh/ { print $0 }'



■ スイッチ

※ NR = 1でTrueに、NR = 5でFalseni

NR == 1, NR == 5



■ 計算

2進数で表現できない数値は計算する際に誤差がでる場合もある

70.21 * 100 = 7021にならないケースがある



■ 乱数

awk '{ srand('"$RANDOM"'); print rand() }'



■ 繰り返し文

awk 'BEGIN {for (i = 1; i <= 5; i++) print i;}'


■ 参考サイト