Linux
awk

awkに関するメモ

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;}'

■ 参考サイト