串刺し印刷のナンバリングを行う

Sus scrofa liaodongensis: 串刺しナンバリング:焼き鳥の一品ではござらぬ にインスパイヤされて同じく awk で処理してみます。

Sus scrofa liaodongensis: 串刺しナンバリング:焼き鳥の一品ではござらぬ に出ているプログラムは非常に良くできているので骨子は全く同じなのですが、検証がしづらいので出力を変更しただけです。

#! /usr/local/bin/nawk -f
# kushizashi.awk
# 串刺し印刷の連番を振る
# usage; nawk -f kushizashi.awk 最大数 面付け数

BEGIN {
    max_num = ARGV[1];
    men     = ARGV[2];

    page = int(max_num / men) + ((max_num % men) ? 1 : 0);

    for (i = 1; i <= page; i++) {
        for (j = 1; j <= men; j++) {

            num = i + (j - 1) * page;

            if (num <= max_num) {
                serial_num[i] = serial_num[i] " | " sprintf("%3d", num);
            } else {
                serial_num[i] = serial_num[i] " | ---";
            }
        }
    }

    for (i = 1; i <= page; i++) {
        print serial_num[i];
        print "----------------------------------------";
    }
}

実行してみます。

$ gawk -f kushizashi.awk 50 6
 |   1 |  10 |  19 |  28 |  37 |  46
----------------------------------------
 |   2 |  11 |  20 |  29 |  38 |  47
----------------------------------------
 |   3 |  12 |  21 |  30 |  39 |  48
----------------------------------------
 |   4 |  13 |  22 |  31 |  40 |  49
----------------------------------------
 |   5 |  14 |  23 |  32 |  41 |  50
----------------------------------------
 |   6 |  15 |  24 |  33 |  42 | ---
----------------------------------------
 |   7 |  16 |  25 |  34 |  43 | ---
----------------------------------------
 |   8 |  17 |  26 |  35 |  44 | ---
----------------------------------------
 |   9 |  18 |  27 |  36 |  45 | ---
----------------------------------------

上から下に見ていくと、確かに串刺し (番号が連続している) になっていることが分かります。

さて、この結果を見ると、面付け数で区切って改行したものを転置すれば良いことが分かりますので、実際にやってみましょう。

#! /usr/local/bin/nawk -f
# pre_kushizashi.awk
# 串刺し印刷の前処理を行う
# usage; nawk -f pre_kushizashi.awk 最大数 面付け数

BEGIN {
    max_num = ARGV[1];
    men     = ARGV[2];

    page = int(max_num / men) + ((max_num % men) ? 1 : 0);

    for (i = 1; i <= max_num; i++) {

        printf("%d ", i);

        if (i % page == 0 || i == max_num) {

            print "";

        }
    }
}

まず、上記のような簡単なスクリプトで表示させます。

$ gawk -f pre_kushizashi.awk 50 6
1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18
19 20 21 22 23 24 25 26 27
28 29 30 31 32 33 34 35 36
37 38 39 40 41 42 43 44 45
46 47 48 49 50

これを転置すれば良いので、AWK Users JP :: 転置行列を作る で使ったものとほぼ同じもので転置させてみます。

#! /usr/local/bin/nawk -f
# transposed_matrix.awk
# 転置行列を作る

{
    for (i = 1; i <= NF; i++) {
        val[i, NR] = $i;
    }

    if (max_nf < NF) {
        max_nf = NF;
    }
}

END {
    for (i = 1; i <= max_nf; i++) {
        for (j = 1; j <= NR; j++) {

            printf("%s%s", val[i, j], OFS);

        }
        print "";
    }
}

違いは、元々最後の行のフィールドの数 (NF) を拾うようになっていのたのですが、最大のフィールド数を拾うように変更したものです。

$ gawk -f pre_kushizashi.awk 50 6 | gawk-f transposed_matrix.awk
1 10 19 28 37 46
2 11 20 29 38 47
3 12 21 30 39 48
4 13 22 31 40 49
5 14 23 32 41 50
6 15 24 33 42
7 16 25 34 43
8 17 26 35 44
9 18 27 36 45

区切り線とかはありませんが、確かに縦に連続した数値が並んで串刺しになっていることが分かります。 あとは、横に並んでいるものを 1 枚の紙のページとして印刷すれば良いだけになります。 tag_nawk.png tag_nawk.png tag_nawk.png tag_nawk.png