#. test sformat();
BEGIN {
_asc_init();
book[1] = "プログラミング言語AWK";
book[2] = "正規表現辞典";
book[3] = "AWKを256倍使うための本";
book[4] = "シェル芸に効く!AWK処方箋";
book[5] = "sed & awkプログラミング";
book[6] = "AWK実践入門";
book[7] = "";
#左寄せ printf("%-30.15s",str)
print "123456789A123456789A123456789A";
for (i in book) print sformat(-30, 15, book[i]);
#右寄せ printf("%30.15s",str)
print "123456789A123456789A123456789A";
for (i in book) print sformat(30, 15, book[i]);
}
#. _asc_init();ASCII+半角カナ辞書(Shift_JIS)
function _asc_init( i, hk, ar, qt) {
for (i
= 0; i
< 128; i
++) _asc
[sprintf("%c", i
)] = i
; hk = "。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚";
qt = split(hk, ar, "");
for (i = 1; i <= qt; i++) _asc[ar[i]] = 160 + i; #Shift_JIS
}
function sformat(fw, prec, str, ch, \
i
, lenb
, strlen, ret
, absfw
) { lenb = 0;
while (ch = substr(str, ++i, 1))
(ch in _asc) ? lenb += 1 : lenb += 2;
i = lenb = 0;
while (ch = substr(str, ++i, 1)) {
(ch in _asc) ? lenb += 1 : lenb += 2;
if (lenb < prec) continue;
else if (lenb == prec) { ret = substr(str, 1, i); break; }
else { ret = substr(str, 1, i - 1) " "; break; }
}
} else { prec
= strlen; ret
= str
; }
(fw < 0) ? absfw = -fw : absfw = fw;
if (!absfw || absfw <= prec) return ret;
else if (fw
> 0) return sprintf("%*s", absfw
- prec
, "") ret
; else return ret
sprintf("%*s", absfw
- prec
, ""); }
Iy4JdGVzdCBzZm9ybWF0KCk7CkJFR0lOIHsKCV9hc2NfaW5pdCgpOwoJYm9va1sxXSA9ICLjg5fjg63jgrDjg6njg5/jg7PjgrDoqIDoqp5BV0siOwoJYm9va1syXSA9ICLmraPopo/ooajnj77ovp7lhbgiOwoJYm9va1szXSA9ICJBV0vjgpIyNTblgI3kvb/jgYbjgZ/jgoHjga7mnKwiOwoJYm9va1s0XSA9ICLjgrfjgqfjg6voirjjgavlirnjgY8hQVdL5Yem5pa5566LIjsKCWJvb2tbNV0gPSAic2VkICYgYXdr44OX44Ot44Kw44Op44Of44Oz44KwIjsKCWJvb2tbNl0gPSAiQVdL5a6f6Le15YWl6ZaAIjsKCWJvb2tbN10gPSAiIjsKCgkj5bem5a+E44GbIHByaW50ZigiJS0zMC4xNXMiLHN0cikKCXByaW50ICIxMjM0NTY3ODlBMTIzNDU2Nzg5QTEyMzQ1Njc4OUEiOwoJZm9yIChpIGluIGJvb2spIHByaW50IHNmb3JtYXQoLTMwLCAxNSwgYm9va1tpXSk7Cgkj5Y+z5a+E44GbIHByaW50ZigiJTMwLjE1cyIsc3RyKQoJcHJpbnQgIjEyMzQ1Njc4OUExMjM0NTY3ODlBMTIzNDU2Nzg5QSI7Cglmb3IgKGkgaW4gYm9vaykgcHJpbnQgc2Zvcm1hdCgzMCwgMTUsIGJvb2tbaV0pOwp9CgoKIy4JX2FzY19pbml0KCk7QVNDSUkr5Y2K6KeS44Kr44OK6L6e5pu4KFNoaWZ0X0pJUykKZnVuY3Rpb24gX2FzY19pbml0KCAgICBpLCBoaywgYXIsIHF0KSB7Cglmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspIF9hc2Nbc3ByaW50ZigiJWMiLCBpKV0gPSBpOwoJaGsgPSAi772h772i772j772k772l772m772n772o772p772q772r772s772t772u772v772w772x772y772z7720772177227723772477257726772777287729772+772/776A776B776C776D776E776F776G776H776I776J776K776L776M776N776O776P776Q776R776S776T776U776V776W776X776Y776Z776a776b776c776d776e776fIjsKCXF0ID0gc3BsaXQoaGssIGFyLCAiIik7Cglmb3IgKGkgPSAxOyBpIDw9IHF0OyBpKyspIF9hc2NbYXJbaV1dID0gMTYwICsgaTsJI1NoaWZ0X0pJUwp9CgpmdW5jdGlvbiBzZm9ybWF0KGZ3LCBwcmVjLCBzdHIsICAgIGNoLCBcCgkJCQkJaSwgbGVuYiwgc3RybGVuLCByZXQsIGFic2Z3KSB7CglsZW5iID0gMDsKCXdoaWxlIChjaCA9IHN1YnN0cihzdHIsICsraSwgMSkpCgkJKGNoIGluIF9hc2MpID8gbGVuYiArPSAxIDogbGVuYiArPSAyOwoJc3RybGVuID0gbGVuYjsKCWlmIChwcmVjICYmIHByZWMgPCBzdHJsZW4pIHsKCQlpID0gbGVuYiA9IDA7CgkJd2hpbGUgKGNoID0gc3Vic3RyKHN0ciwgKytpLCAxKSkgewoJCQkoY2ggaW4gX2FzYykgPyBsZW5iICs9IDEgOiBsZW5iICs9IDI7CgkJCWlmIChsZW5iIDwgcHJlYykgY29udGludWU7CgkJCWVsc2UgaWYgKGxlbmIgPT0gcHJlYykgeyByZXQgPSBzdWJzdHIoc3RyLCAxLCBpKTsgYnJlYWs7IH0KCQkJZWxzZSB7IHJldCA9IHN1YnN0cihzdHIsIDEsIGkgLSAxKSAiICI7IGJyZWFrOyB9CgkJfQoJfSBlbHNlIHsgcHJlYyA9IHN0cmxlbjsgcmV0ID0gc3RyOyB9CgoJKGZ3IDwgMCkgPyBhYnNmdyA9IC1mdyA6IGFic2Z3ID0gZnc7CglpZiAoIWFic2Z3IHx8IGFic2Z3IDw9IHByZWMpIHJldHVybiByZXQ7CgllbHNlIGlmIChmdyA+IDApIHJldHVybiAgc3ByaW50ZigiJSpzIiwgYWJzZncgLSBwcmVjLCAiIikgcmV0OwoJZWxzZSByZXR1cm4gcmV0IHNwcmludGYoIiUqcyIsIGFic2Z3IC0gcHJlYywgIiIpOwp9Cg==