curses みたいにターミナルの任意の位置にテキストを出す関数

cursesみたいにターミナルの任意の位置にテキストを出す関数 - みずぴー日記 にインスパイヤされつつも、最近すっかり『みずぴー日記』の追っかけとなっていますが、簡単な良い例が豊富なため、参考にさせてもらっています。

さて、awk でも同じことができますが、以下の点が異なります。

  • "\e" の代わりに "\033" を使います。

既にエスケープシーケンスを用いたものは AWK Users JP :: awk でテトリスみたいなゲームをつくろう! (嘘) などでも出ています。

#! /usr/local/bin/nawk -f
# writeat.awk
# usage: nawk -f writeat.awk
# curses みたいにターミナルの任意の位置にテキストを出す関数

# print_at():   curses みたいにターミナルの任意の位置にテキストを出す
#   in:     座標 (x, Y)
#           左上原点、右下方向が正
#           文字列 (str)
function print_at(x, y, str) {
    printf("\033[%d;%dH", y, x);
    print str;
}

# clear():  画面消去
function clear() {
    printf("\033[H\033[2J");
}

# repeat_str():     文字列を連接する
#   in:     文字列 (str)
#           数値 (num)
#   out:    文字列 (str) を数値 (num) だけ繋げた文字列
function repeat_str(str, num,    i, result) {
    for (i = 1; i <= num; i++) {
        result = result str;
    }

    return result;
}

BEGIN {
    clear();

    for (i = 1; i <= 5; i++) {
        print_at(6 - i, i, repeat_str("*", 2 * i - 1));
    }

    for (i = 1; i <= 3; i++) {
        print_at(4, 5 + i, "***");
    }
}

かなり元の Perl スクリプトに近いものにしてあるので、awk と Perl の違いが良くわかあると思います。

$ nawk -f writeat.awk
    *
   ***
  *****
 *******
*********
   ***
   ***
   ***

もちろん、AWK Users JP :: コンソールアナログ時計 で記述したように配列を使って表示させることもできますが、エスケープシーケンスの方が楽です。

tag_nawk.png tag_nawk.png tag_nawk.png tag_nawk.png