2010年8月11日水曜日

CONVFMT = 数値を文字列に自動変換する時の書式 - AWK

AWKの数値計算関数と関連機能
AWKの文字列操作関数と関連機能
AWKの入出力関数とコマンド実行機能
○Gawk on Windows ○Gawk ○mawk32 ○Mawk ○awk
数値と文字列を並べて書く時の、数値から文字列への自動変換に使う書式です。

o 但し、printを使って数値1つだけを書き出す時は、変数OFMTで指定した書式を使います。


**** 書式
--------
CONVFMT
もしくは
CONVFMT = "表示用書式"
--------

o CONVFMTは変数です。初期値は"%.6g"、パーセント記号の後ろにピリオドが入っています。
o 表示用書式 -- printfで指定出来る書式の中から、実数を変換出来るものを選びます。例。"%.10g"


**** 使用例
--------
BEGIN {
  CONVFMT = "%.10g";
  print "名前と、食べたケーキの量";
  print "ミクさんは、" 1/3 "個";
  print "リンちゃんは、" 1/3 "個";
  print "レン君は、" "作る時に味見。";
  print "ルカ様は、" 1/3 "個";
}
--------

o 行末のセミコロンは、C言語の書き方に合わせました。無くても動きます。


**** 機能
o 数値と文字列を並べて書くと、AWKは、数値から文字列に自動変換します。その時に使う書式です。
   + 数値と数値を並べた時も、CONVFMTを使います。
   + printを使って数値1つだけを書き出す時は、変数OFMTを使います。
o 関数の文字列引数に数値を指定した時も、CONVERTを使って自動変換します。
o 初期値は"%.6g"、パーセント記号の後ろにピリオドが入っています。
o カンマで区切った時は、カンマの間に数値と他の値が並んで入っている所に対して、この書式を使います。
o CONVFMTに従って変換するのは、他の値と連結するように書いた時などです。
   + カンマで区切る場合は、カンマ間に複数の値がある場合、CONVFMTを使って変換します。
   + 関数に渡す時の変換も、CONVFMTを使っていました。
--------
   print "ミクさん" 1/3
   print "ミクさん" 1/3, 1/3 1/3
   v = "ミクさん" 1/3
   v = 1/3 1/3
   v = length(1/3)
--------

o 一方、printで数値を1つだけ指定する時は、CONVFMTの効き目はありません。変数OFMTを使います。


**** メモ
o CONVFMTが正しく動かない時の原因
   + CONVFMTの設定が効いていない様に見える場合 = 変数OFMTにも、CONVFMTと同じ値を入れてみます。
   + 整数の値が変になる = 実数にも対応出来る値を指定します。例外はGawk。変数CONVFMTににおける書式"%d"(整数値で出力)をサポートしている模様です。
   + プログラム実行途中で強制終了する = 変数CONVFMTに、誤った書式"%s"(文字列を出力)を渡すと、処理系によっては起こる事があります。この現象が発生した処理系は、mawk32 1.3.3 / Mawk for Windows 1.3.3 / original = the one true awk(updated May 1, 2007)です。(Gawkでは起こりませんでした。)


**** 確認した処理系
o Gawk on Windows 3.1.7
o Gawk for Windows 3.1.6
o mawk MBCS (32bit版) 1.3.3
o Mawk for Windows 1.3.3
o original = the one true awk(updated May 1, 2007)


==
関連ページ:
    ▼AWKの数値計算関数と関連機能▼ABC順
    ▼AWKの文字列操作関数と関連機能▼ABC順
    ▼AWKの入出力関数とコマンド実行機能▼ABC順
    ▼AWKプログラムを書く▼ABC順
    ▼AWK
    ▼制作メモ
    > ?: = 条件演算子
    > IGNORECASE = 文字列比較の時に、大文字小文字を区別させない(Gawk専用)
    > FIELDWIDTHS = 固定長ファイルを読み込む為の設定
    +
    print = ファイルなどに書き出す
    OFMT = printを使って数値1つだけを書き出す時の書式

OFMT = printを使って数値1つだけを書き出す時の書式 - AWK

AWKの数値計算関数と関連機能
AWKの文字列操作関数と関連機能
AWKの入出力関数とコマンド実行機能
○Gawk on Windows ○Gawk ○mawk32 ○Mawk ○awk
printを使って数値1つだけを書き出す時の書式です。

o それ以外の自動変換でも同じ書式を使いたい時は、変数CONVFMTにも同じ値を設定します。


**** 書式
--------
OFMT
もしくは
OFMT = "表示用書式"
--------

o OFMTは変数です。初期値は"%.6g"、パーセント記号の後ろにピリオドが入っています。
o 表示用書式 -- printfで指定出来る書式の中から、実数を変換出来るものを選びます。例。"%.10g"


**** 使用例
--------
BEGIN {
  OFMT = "%.10g";
  print "名前", "食べたケーキの量";
  print "ミクさん", 1/3;
  print "リンちゃん", 1/3;
  print "レン君", "作る時に味見。";
  print "ルカ様", 1/3;
}
--------

o 行末のセミコロンは、C言語の書き方に合わせました。無くても動きます。


**** 機能
printを使って数値1つだけを書き出す時の書式です。
   + それ以外の自動変換では、変数CONVFMTを使います。
o 初期値は"%.6g"、パーセント記号の後ろにピリオドが入っています。
o カンマで区切った時は、カンマの間に数値1つだけが入っている所に対して、この書式を使います。
o OFMTに従って変換するのは、printを使って次のように書いた時です。
   + print 1/3;
   + print "ミクさん", 1/3; # カンマで区切る場合は、カンマ間に数値1つだけを指定した所だけ、OFMTを使って変換します。
o 上記以外の書き方では、OFMTの効き目はありません。変数CONVFMTを使います。


**** メモ
o OFMTが正しく動かない時の原因
   + OFMTの設定が効いていない様に見える場合 = 変数CONVFMTにも、OFMTと同じ値を入れてみます。
   + 整数の値が変になる = 実数にも対応出来る値を指定します。例外はGawk。変数CONVFMTににおける書式"%d"(整数値で出力)をサポートしている模様です。


**** 確認した処理系
o Gawk on Windows 3.1.7
o Gawk for Windows 3.1.6
o mawk MBCS (32bit版) 1.3.3
o Mawk for Windows 1.3.3
o original = the one true awk(updated May 1, 2007)


==
関連ページ:
    ▼AWKの数値計算関数と関連機能▼ABC順
    ▼AWKの文字列操作関数と関連機能▼ABC順
    ▼AWKの入出力関数とコマンド実行機能▼ABC順
    ▼AWKプログラムを書く▼ABC順
    ▼AWK
    ▼制作メモ
    > CONVFMT = 数値を文字列に自動変換する時の書式
    ?: = 条件演算子
    IGNORECASE = 文字列比較の時に、大文字小文字を区別させない
    > FIELDWIDTHS = 固定長ファイルを読み込む為の設定(Gawk専用)
    BINMODE = バイナリモードで読み書きする(mawk,Gawk専用)
    +
    print = ファイルなどに書き出す

2010年8月10日火曜日

FIELDWIDTHS = 固定長ファイルを読み込む為の設定(Gawk専用) - AWK

AWKの入出力関数とコマンド実行機能
○(文字数)Gawk on Windows ○(バイト数)Gawk ×mawk32 ×Mawk ×awk
固定長ファイルを読み込む為の設定です。
o Gawk on Windows 3.1.7で使用する時は、少しコツが必要です。

**** 書式
--------
FIELDWIDTHS
もしくは
FIELDWIDTHS = "空白区切りの数字"
--------

o この変数は、Gawkの拡張機能です。
o FIELDWIDTHSは変数です。
o 空白区切りの数字 -- 各列の長さを指定します。例 = "3 9 3"
   + 長さの単位は、処理系によって異なります。


**** 使用例
o 固定長のファイルをタブ区切りに変更する例
    + Gawk on Windows 3.1.7の場合は、「 -Wctype=ASCII」オプションを付けて実行します。
--------
BEGIN {
  FIELDWIDTHS = "3 9 3"; # 読み込みは固定長
  OFS = "\t"; # 書き出しはタブ区切り(printのカンマを変換)
}
{
  for (i = 1; i <= NF; ++i) {
    sub(/^([ \t]| )+/, "", $i); # 先頭の空白文字除去は、お好みで。
    sub(/([ \t]| )+$/, "", $i); # 最後の空白文字を除去します。
    gsub(/\t/, " ", $i); # データの途中にあるタブ文字は、とりあえず半角空白化。
  }
  print $1, $2, $3;
}
--------

o 行末のセミコロンは、C言語の書き方に合わせました。無くても動きます。


**** 機能
o この変数を設定すると、次回以降の読み込みを固定長ファイル形式に切り替えます。
   + 関数を使わずに 1行読み込んだ時(= $1などの値を入れる時に使います)
   + getline関数で、読み込んだデータを入れる変数を指定しなかった時(= $1などの値を入れる時に使います)
o 長さの単位は、処理系によって異なります。文字数で数える処理系と、バイト数で数える処理系があります。
o 変数FSと競合します。Gawkが行を読み込む時、最後に設定した方の値を使います。
o 設定を途中で変える事が出来ます。設定した値は、次の行の読み込み時に反映されます。
o この機能をサポートしていない処理系があります。

** 処理系に依存する動作
o この機能をサポートしている処理系は、次の通りです。
   + Gawk on Windows 3.1.7
   + Gawk for Windows 3.1.6

o 読み込むファイルに漢字などの全角文字が混じっている場合、処理系によって動きが異なります。
o 文字数で数える処理系
   + Gawk on Windows 3.1.7
   + 但し、バイト数で数えさせるオプションもあります。「 -Wctype=ASCII」を付けて実行します。
   + この時、文字列操作関数が全角文字を2文字と数えますので、mawkと同じように書きます。
o バイト数で数える処理系
   + Gawk for Windows 3.1.6
   + バイト数で数える場合、全角文字の途中で区切らないように注意します。
   + 理由は、全角文字の途中で区切ると、文字が分割されて文字化けするからです。


**** メモ
o 文字化けが起こる場合の原因は、おそらく、バイト単位で数える処理系を使っていて、全角文字の途中で区切ったからです。
o 企業が公開している固定長データの数え方は、おそらくバイト数です。
   + 趣味で作っているような場合は、文字数になっているかもしれません。
o データには半角カタカナが混じっている事もあります。必要に応じて全角カタカナに変換します。
   + 濁点などは要注意。「が」や「ぱ」を半角文字で表現すると、2文字になります。
o この変数は、文字列操作関数のsplit(文字列の分割)には影響を与えません。変数FSとは異なります。


**** 確認した処理系
o Gawk on Windows 3.1.7 -- 数える単位は文字数。「 -Wctype=ASCII」オプションでバイト数
o Gawk for Windows 3.1.6
o mawk MBCS (32bit版) 1.3.3 -- 非対応
o Mawk for Windows 1.3.3 -- 非対応
o original = the one true awk(updated May 1, 2007) -- 非対応


==
関連ページ:
    ▼AWKの入出力関数とコマンド実行機能▼ABC順
    ▼AWKプログラムを書く▼ABC順
    ▼AWK
    ▼制作メモ
    > BINMODE = バイナリモードで読み書きする
    /inet = AWKからインターネットにアクセスする(Gawk専用)
    /dev/stdout = 標準出力を示すファイル名
    +
    getline = ファイル(やパイプ)から1行読み込む
    FS = 読み込んだ行を列に分割する時の区切り文字
    RS = 1行読み込む時の改行文字
(2010年10月4日変更。Gawk on WindowsのACSIIオプションは、-Wとctypeの間を詰める)
(2010年9月6日変更。Gawk on Windowsの判定を△から○に変更)
(2010年8月10日追加。Gawk on Windowsにバイト数で数えさせる方法)