awk で sl

Pythonでsl - みずぴー日記 で Python を用いた sl コマンドが紹介されているのにインスパイヤされて、awk で sl を作ってみます。

『Real UNIX MAGAGINE Day』が 2007 年に開催され、この際にも sl コマンドが話題になっていたのですが、sl コマンドは元々プロンプトで作っていた悪戯がエスカレートして、awk を使った悪戯になり、最終的には sl コマンドを curses ライブラリで実装したということです。

実装方法としては AWK Users JP :: curses みたいにターミナルの任意の位置にテキストを出す関数 と同じ手法を用います。

#! /usr/local/bin/nawk -f
# mini_sl.awk
# Ref: http://log.utashiro.com/pub/2007/04/sl_2eae.html
# usage: nawk -f mini_sl.awk

{
    line[NR] = $0;

    if (max_length < length($0)) {
        max_length = length($0);
    }
}

END {
    for (i = 1; i <= max_length; i++) {

        for (j = 1; j <= NR; j++) {
            print_at(0, j, substr(line[j], i));
        }

        system("sleep 0.05");
        clear();
    }
}

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

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

また、入力ファイルとして以下のようなテキストファイルを用意します。

$ cat sl.txt
      ====        ________                ___________
  _D _|  |_______/        \__I_I_____===__|_________|
   |(_)---  |   H\________/ |   |        =|___ ___|      _________________
   /     |  |   H  |  |     |   |         ||_| |_||     _|                \_____A
  |      |  |   H  |__--------------------| [___] |   =|                        |
  | ________|___H__/__|_____/[][]~\_______|       |   -|                        |
  |/ |   |-----------I_____I [][] []  D   |=======|____|________________________|_
__/ =| o |=-~~\  /~~\  /~~\  /~~\ ____Y___________|__|__________________________|_
 |/-=|___||    ||    ||    ||    |_____/~\___/         |_D__D__D_|  |_D__D__D_|
  \_/      \__/  \__/  \__/  \__/      \_/              \_/   \_/    \_/   \_/

実行は以下のようにして実行します。

$ nawk -f mini_sl.awk sl.txt
      ====        ________                ___________
  _D _|  |_______/        \__I_I_____===__|_________|
   |(_)---  |   H\________/ |   |        =|___ ___|      _________________
   /     |  |   H  |  |     |   |         ||_| |_||     _|                \_____A
  |      |  |   H  |__--------------------| [___] |   =|                        |
  | ________|___H__/__|_____/[][]~\_______|       |   -|                        |
  |/ |   |-----------I_____I [][] []  D   |=======|____|________________________|_
__/ =| o |=-~~\  /~~\  /~~\  /~~\ ____Y___________|__|__________________________|_
 |/-=|___||    ||    ||    ||    |_____/~\___/         |_D__D__D_|  |_D__D__D_|
  \_/      \__/  \__/  \__/  \__/      \_/              \_/   \_/    \_/   \_/

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