2010年10月30日

串刺しナンバリング:改訂したけど、ウミスズメの黒焼きではありません

連番を任意の数字から始められるようにしてみました。ついでにスクリプト名や変数名を整理しました。(if...else構文も正しくしました:30日21時) ^_^


#  kszs.awk
#
#  使い方:
#  awk  -f  kszs.awk  >  num.txt

BEGIN {

#  連番開始・終了番号と面付数の入力を求める
    printf "開始番号=" > "/dev/stderr"
      getline sn_start < "/dev/stdin"
    printf "終了番号=" > "/dev/stderr"
      getline sn_end   < "/dev/stdin"
    printf "面付数="   > "/dev/stderr"
      getline n_men   < "/dev/stdin"

#  連番の個数を計算する
    n_sn = sn_end - sn_start + 1

#  総シート数(ページ数)を計算する # 以下6行訂正しました
    n = int ( n_sn / n_men )
    if ( n_sn % n_men == 0 ) {
        n_sheet = n
    } else {
        n_sheet = n + 1
    }
##    n_sheet = int ( 0.5 + n_sn / n_men )  # これは間違いでした

#  i は作業中のシート番号
    for ( i = 0; i < n_sheet; i++ ) {

#      j はシート内の面番号
        for ( j = 0; j < n_men; j++ ) {

#          シート番号と連番開始番号との和が
#          そのシート内最初の連番になる
#          また、総シート数の値が連番の増分となる 
            serialnum = i + sn_start + j * n_sheet

#          連番を標準出力に改行付きで書き出す
#          最大数を超えている場合は改行だけを書き出す
            if ( serialnum <= sn_end ) {
                print serialnum
            } else {
                print ""
            }
        }
    }
}


経緯については、前の記事をご参照ください。
    http://lamium.blogspot.com/2010/10/blog-post_30.html

それより、やもさんの新しい記事の方が、串刺しやこの間の経緯がよくわかります。
    Kushizashiはワールドワイドに

1 件のコメント:

  1. MacOSX附属のa2pで、awkスクリプトをperlスクリプトに変換してみました。ほとんど同じだけど...

    なお、a2pはASCII以外は文字化けするようなので、awkスクリプト中の「開始番号」「終了番号」「面付数」をいったんASCII表記に直して、a2pに与え、生成したperlスクリプトで元にもどしました。

    変換時に、「Please check my work on the 1 line I've marked with "#???".
    The operation I've selected may be wrong for the operand types.」というエラーメッセージがでたけど、perlスクリプトはちゃんと動く模様。

    ここへの書き込み時にインデントが飛んでしまって読みにくくなってますが、ご勘弁を。


    #!/usr/bin/perl
    eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
    if $running_under_some_shell;
    # this emulates #! processing on NIH machines.
    # (remove #! line above if indigestible)

    eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift;
    # process any FOO=bar switches

    open(_DEV_STDERR, '>/dev/stderr') || die 'Cannot create file "/dev/stderr".';
    open(_DEV_STDIN, '/dev/stdin') || die 'Cannot open file "/dev/stdin".';

    $, = ' '; # set output field separator
    $\ = "\n"; # set output record separator

    printf _DEV_STDERR '開始番号=';
    $sn_start = &Getline3('_DEV_STDIN');
    printf _DEV_STDERR '終了番号=';
    $sn_end = &Getline3('_DEV_STDIN');
    printf _DEV_STDERR '面付数=';
    $n_men = &Getline3('_DEV_STDIN');

    $n_sn = $sn_end - $sn_start + 1;

    $n = int($n_sn / $n_men);
    if ($n_sn % $n_men == 0) {
    $n_sheet = $n;
    }
    else {
    $n_sheet = $n + 1;
    }

    for ($i = 0; $i < $n_sheet; $i++) {
    for ($j = 0; $j < $n_men; $j++) {
    $serialnum = $i + $sn_start + $j * $n_sheet;

    if ($serialnum <= $sn_end) { #???
    print $serialnum;
    }
    else {
    print '';
    }
    }
    }

    sub Getline3 {
    ($fh) = @_;
    local($_);
    if ($getline_ok = (($_ = <$fh>) ne '')) {
    ;
    }
    $_;
    }

    返信削除