fork download
  1. #. test sformat();
  2. BEGIN {
  3. _asc_init();
  4. book[1] = "プログラミング言語AWK";
  5. book[2] = "正規表現辞典";
  6. book[3] = "AWKを256倍使うための本";
  7. book[4] = "シェル芸に効く!AWK処方箋";
  8. book[5] = "sed & awkプログラミング";
  9. book[6] = "AWK実践入門";
  10. book[7] = "";
  11.  
  12. #左寄せ printf("%-30.15s",str)
  13. print "123456789A123456789A123456789A";
  14. for (i in book) print sformat(-30, 15, book[i]);
  15. #右寄せ printf("%30.15s",str)
  16. print "123456789A123456789A123456789A";
  17. for (i in book) print sformat(30, 15, book[i]);
  18. }
  19.  
  20.  
  21. #. _asc_init();ASCII+半角カナ辞書(Shift_JIS)
  22. function _asc_init( i, hk, ar, qt) {
  23. for (i = 0; i < 128; i++) _asc[sprintf("%c", i)] = i;
  24. hk = "。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚";
  25. qt = split(hk, ar, "");
  26. for (i = 1; i <= qt; i++) _asc[ar[i]] = 160 + i; #Shift_JIS
  27. }
  28.  
  29. function sformat(fw, prec, str, ch, \
  30. i, lenb, strlen, ret, absfw) {
  31. lenb = 0;
  32. while (ch = substr(str, ++i, 1))
  33. (ch in _asc) ? lenb += 1 : lenb += 2;
  34. strlen = lenb;
  35. if (prec && prec < strlen) {
  36. i = lenb = 0;
  37. while (ch = substr(str, ++i, 1)) {
  38. (ch in _asc) ? lenb += 1 : lenb += 2;
  39. if (lenb < prec) continue;
  40. else if (lenb == prec) { ret = substr(str, 1, i); break; }
  41. else { ret = substr(str, 1, i - 1) " "; break; }
  42. }
  43. } else { prec = strlen; ret = str; }
  44.  
  45. (fw < 0) ? absfw = -fw : absfw = fw;
  46. if (!absfw || absfw <= prec) return ret;
  47. else if (fw > 0) return sprintf("%*s", absfw - prec, "") ret;
  48. else return ret sprintf("%*s", absfw - prec, "");
  49. }
  50.  
Success #stdin #stdout 0s 23464KB
stdin
Standard input is empty
stdout
123456789A123456789A123456789A
プログラミング                
正規表現辞典                  
AWKを256倍使う                
シェル芸に効く!               
sed & awkプログ               
AWK実践入門                   
                              
123456789A123456789A123456789A
               プログラミング 
                  正規表現辞典
               AWKを256倍使う 
               シェル芸に効く!
               sed & awkプログ
                   AWK実践入門