2010年9月5日日曜日

入出力とコマンド実行の注意点まとめ - AWK

AWKの入出力とコマンド実行機能
**** 処理系共通の注意点
o Windows版では、コマンドの括り文字は「"」(= 二重引用符)だけの処理系が、ほとんどです。
   + 「"」を文字列中に書きたい時は、「\"」と書きます。


**** 特定の処理系に関する注意点
** Gawk系特有の動作
o Windows版の各処理系では、「|& コマンド」や「コマンド |&」の書き方は非対応です。
   + 確認したバージョン
   + Gawk on Windows 3.1.7
   + Gawk for Windows 3.1.6
o UTF-8のテキストファイルを読み込む場合、1行目に限り、$0と $1について、表示されている文字数よりも多く数える事があります。
     + Gawk on Windows 3.1.7 = 1文字多く数えます。
     + Gawk for Windows 3.1.6 = 2文字多く数えます。
   + 原因は、UTF-8で保存したファイルの先頭にあった、UNICODE特有の見えない文字(= BOM = EF BB BF)。
   + Windows XPのメモ帳で保存する時に UTF-8を指定すると、BOMが付くみたいです。
      + メモ帳に限らず、Windows 上の UTF-8ファイルは、BOMが付く方が便利です。(= ファイルを開く時に文字化けしません。)
   + 対策方法は「UTF-8のファイルから、BOMを除去する方法


==
関連ページ:
    ▼AWKの入出力関数とコマンド実行機能▼ABC順
    ▼AWKプログラムを書く▼ABC順
    ▼AWK
    ▼制作メモ
    > ファイルからデータを読み込む
    タブ区切りでファイルを読み込む
    AWKでバイナリ出力する(mawk, Gawk専用)
    +
    文字列操作関数使用時の注意点まとめ
    数値計算関数使用時の注意点まとめ
    時刻取得関数を使う時の注意点まとめ
    配列を使う時の注意点まとめ

mktime = 特定日時の時刻値(= 基準時刻からの経過秒数)を調べる(Gawk専用) - AWK

AWKの時刻取得関数と関連機能
○Gawk on Windows ○Gawk ×mawk32 ×Mawk ×awk
特定日時の時刻値(= 基準時刻からの経過秒数 = Unix Time)を調べます。

o 時刻文字列に変換したい時は、「strftime = 時刻を文字列に変換する


**** 書式
--------
mktime( 時刻文字列 )
--------

o この関数は、Gawkの拡張機能です。
o 日時文字列 -- 数字の並びで指定します。
   + 時刻文字列の書き方は、"年 月 日 時 分 秒 [夏時間フラグ]"
   + 書き方の例。"2010 3 9 23 59 59" もしくは、"2010 3 9 23 59 59 0"
   + 月などの前ゼロはお好みで。付けても付けなくても、同じ結果になります。
   + 詳しい書き方は、下の通りです。
o 戻り値 -- -1以外 = 基準時刻からの経過秒数(= Unix time) / -1 = 変換失敗
   + 通常、UTC(= 協定世界時)で1970年1月1日の0時からの経過秒数。但し、閏秒は数えません。

** 日時文字列 の書き方について
o 夏時間フラグは、省略も出来ます。
o 年以外は、0や負の値を指定する事も出来ます。
   + 月の場合、0月は、前年の12月を指します。-1なら11月です。
   + 日の場合、0日は、前月の最終日を指します。-1なら2日前です。
   + 時分秒は、素直に計算出来ます。-1時なら1時間前です。
o 数字の間に入れるのは、半角空白です。2つ入れたり、タブ文字を入れても大丈夫でした。
o 夏時間フラグは、1 = 夏時間 / 0 = 標準時間 / -1 = 自動判定(初期値)
o 夏時間の自動判定方法は、処理系をコンパイルした時に使ったC言語処理系に依存します。
o 今の所、指定出来る時刻は次の通りです。
   + 世界協定時: 1970年1月1日0時0分0秒(UTC)から 2038年1月19日3時14分7秒(UTC)まで
   + 日本標準時: 1970年1月1日9時0分0秒から 2038年1月19日12時14分7秒まで
   + なお、2038年以降指定出来ない問題は、近い将来登場する(おそらく64ビットOS用の)処理系で解決される見通しです。


**** 使用例
--------
BEGIN {
print mktime("2010 12 31 -12 0 0"); # 12時間前の時刻値を求めます。
print strftime("%Y/%m/%d %H:%M:%S", mktime()); # 文字列にしたい時
}
--------

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


**** 機能
o 特定日時の時刻値(= 基準時刻からの経過秒数 = Unix Time)を調べます。
o 基準時刻は、通常、UTC(= 協定世界時)の1970年1月1日の0時です。閏秒は数えません。
o 詳しくは、「systime = 現在の時刻値(= 基準時刻からの経過秒数)を調べる」の通りです。
o 戻り値は、整数です。読み易い文字列に変換したい時には、strftimeを使います。
o この機能をサポートしていない処理系があります。

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

o この機能は、AWKのコンパイル環境によっては、2038年問題を抱えています。
o 2038年1月19日3時14分7秒を超える時刻を指定すると、-1を返す処理系
   + Gawk on Windows 3.1.7
   + Gawk for Windows 3.1.6


**** 確認した処理系
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
    ▼制作メモ
    > srand = 乱数の種を設定する
    strftime = 時刻を文字列に変換する(Gawk, mawk32専用)
    +
    systime = 現在の時刻値(= 基準時刻からの経過秒数)を調べる(Gawk, mawk32専用)
    ツール。systime関数とsrand関数の戻り値予想(Unix time)
(2010年6月23日追加。戻り値の内容はAWKの仕様外)

strtonum = 10進数、8進数、16進数の文字列を数値に変換する(Gawk専用) - AWK

AWKの数値計算関数と関連機能
AWKの文字列操作関数と関連機能
○Gawk on Windows ○Gawk ×mawk32 ×Mawk ×awk
指定された文字列を、数値に変換します。

o 数字の前にゼロが付いている時、8進数として解釈します。
o 8進数や16進数の場合、正の整数部分だけを変換します。


**** 書式
--------
strtonum( 変換したい値 )
--------

o この関数は、Gawkの拡張機能です。
o 変換したい値 -- 数値に変換したい文字列(例:"39.39だよ")
   + 先頭が 0(= 数字のゼロ)で後ろに数字が続く時、8進数であると解釈します。
   + 先頭が 0x もしくは 0X で後ろに数字が続く時、16進数であると解釈します。
o 戻り値 -- 変換結果


**** 使用例
--------
BEGIN {
  print strtonum("39.3"); # 39.3

  print "# 以下、計算結果の確認です。";
  print strtonum("-39.3aaa"); # -39.3
  print strtonum("012"); # 8進数 = 8 + 2 = 10
  print strtonum("0x12"); # 16進数 = 16 + 2 = 18
  print strtonum("0X12"); # 16進数 = 16 + 2 = 18
  print strtonum("Mikusan"); # 0
}
--------

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


**** 機能
o 文字列から数値に変換します。
o 8進数や16進数の場合、正の整数部分だけを変換します。

o 先頭が 0 (= 数字のゼロ)で後ろに数字が続く時、8進数と解釈します。
   + 例えば、「012」は 8進数、「0.12」や「-012」は10進数と解釈します。
o 先頭が 0x もしくは 0X で後ろに数字が続く時、16進数と解釈します。
   + 例えば、「0x12」は 16進数、「-0x12」や「0x-12」は 10進数と解釈して0になります。

o その他の場合、10進数と解釈します。
o 実数を指定すると、6桁までに丸めたり、浮動小数点形式になります。
   + この動作を変えたい時は、変数 CONVFMTを使います。詳しくは、「数値から文字列にする時に、実数を7桁以上表示させる方法

o 数値の後ろに文字列が続いていても大丈夫です。
o 先頭に数値以外の文字がある場合
   + 半角空白は読み飛ばし、10進数と解釈します。
   + それ以外の文字があると、0 を返します。
o この機能をサポートしていない処理系があります。

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

o この関数で変換した結果についてです。
o 数値の有効桁数は、15桁程度です。C言語のdouble型に依存しています。
o 整数の値を18桁以上表示する時、処理系毎に表示形式が異なります。
   + 常に整数表示、かつ誤差をそのまま残す処理系 = Gawk for Windows 3.1.6
   + 常に整数表示、かつ、およそ18桁目以降を0で埋める処理系 = Gawk on Windows 3.1.7と


**** メモ
o Gawk以外の処理系の場合、10進数については、文字列の後ろに「+ 0」をつける事で数値化出来ます。
   + 文字列を実数に変換する時、6桁までに丸めたりしますので、必要に応じて変数 CONVFMTを使います。

**** 確認した処理系
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
    ▼制作メモ
    > sqrt = 平方根を求める
    sin = 正弦を求める
    > split = 文字列を分割する
    sprintf = 文字列を組み立てる
    +
    int = 実数や文字列を整数化する
(2010年9月5日変更。表現の訂正。8進数と16進数の判定は、キーワード 0 0x 0Xの後ろに数字が続く事が条件)