2010年8月30日月曜日

PROCINFO = AWKのプロセスに関する情報。プロセスIDなど(Gawk専用) - AWK

AWKのパターンと制御文
△(部分対応)Gawk on Windows △(部分対応)Gawk ×mawk32 ×Mawk ×awk
AWKのプロセスに関する情報です。
o Windows版のGawkでは、部分的に対応していました。プロセスIDを取得する事が出来ます。

**** 書式
--------
PROCINFO[ "要素名" ]
--------

o この変数は、Gawkの拡張機能です。
o PROCINFOは配列です。 = 変数です。
o 要素名 -- pid などを指定出来ます。指定出来る値は、機能欄の通りです。


**** 機能
o PROCINFO["pid"] で、実行しているAWKのプロセスIDを取得出来ます。
o Windows版の場合、その他の値は、正しく設定されていない事があります。
o この機能をサポートしていない処理系があります。

o Gawk on Windows 3.1.7の場合
--------
PROCINFO["ppid"] = [0]
PROCINFO["pgrpid"] = [0]
PROCINFO["gid"] = [0]
PROCINFO["egid"] = [0]
PROCINFO["version"] = [3.1.5a]
PROCINFO["FS"] = [FS]
PROCINFO["uid"] = [0]
PROCINFO["euid"] = [0]
PROCINFO["pid"] = [2396]
--------


o Gawk for Windows 3.1.6の場合
--------
PROCINFO["ppid"] = [0]
PROCINFO["pgrpid"] = [0]
PROCINFO["gid"] = [0]
PROCINFO["egid"] = [0]
PROCINFO["version"] = [3.1.6]
PROCINFO["FS"] = [FS]
PROCINFO["uid"] = [0]
PROCINFO["euid"] = [0]
PROCINFO["pid"] = [2332]
--------


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


**** メモ
o Gawk以外では、外部プログラムを作って呼び出す方法が、きっと一番お手軽です。
   + 親プロセスのプロセスIDを表示するプログラムを作って、getline関数で取得します。
   + もしくは、「親プロセスのプロセスIDを終了コードに設定するプログラムを作って、system関数」でも取得出来そうです。この時は、最大値の時に正しく渡るかどうか、確認する必要がありそうです。

** その他
o 確認に使ったプログラムです。
--------
BEGIN {
  for (i in PROCINFO) {
    print "PROCINFO[\"" i "\"] = [" PROCINFO[i] "]";
  }
}
--------



**** 確認した処理系
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
    ▼制作メモ
    > AWKPATH = コマンドでAWKファイル名を指定する時、ファイルの場所を省略する(Gawk, mawk32専用)
    +
    ENVIRON = 環境変数。読み取り専用
(2010年9月1日変更。メモにあるソースコードを訂正)

2010年8月29日日曜日

RT = 最後に読み込んだ行の改行文字(Gawk専用) - AWK

AWKの入出力関数とコマンド実行機能
○Gawk on Windows ○Gawk ×mawk32 ×Mawk ×awk
1行読み込んだ時に実際に行を区切った文字、もしくは文字列が入っています。

**** 書式
--------
RT
--------

o この変数は、Gawkの拡張機能です。
o RTは変数です。


**** 使用例
--------
BEGIN {
  RS = "(ミク)|(ネギ)"; # RSを使って、読み込む時の改行文字を指定します。
}
{
  ORS = RT "さん"; # ORSは、書き出す時の改行文字です。「ミクさん」「ネギさん」
  print ;
}
--------

o このサンプルは、大きな文書の変換は苦手です。
   + 「ミク」「ネギ」という単語が出てこないと、文書全部を1行として読み込むからです。
o 行末のセミコロンは、C言語の書き方に合わせました。無くても動きます。


**** 機能
o 1行読み込んだ時に、実際に行を区切った文字もしくは文字列が入っています。
o Gawk以外の処理系では、今の所対応していませんでした。
o この機能をサポートしていない処理系があります。

** 処理系に依存する動作
o この機能をサポートしている処理系は、次の通りです。
   + 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
    ▼制作メモ
    > FNR = 現在読み込み中のファイルから読み込んだ行数
    NR = これまでに読み込んだ行数
    ERRNO = 入出力系の最新エラーメッセージ(Gawk専用)
    +
    RS = 1行読み込む時の改行文字
    ORS = printを使って出力する時の改行文字
    ▼AWKの文字列操作関数と関連機能

2010年8月26日木曜日

AWKプログラムを速く動かす方法 - AWK

AWKプログラムを動かす
お気に入りのAWKプログラムを毎日実行していて、「もう少し速く動かしたいなあ」と思った事はありませんか。
その時には、次のような方法を使う事が出来そうです。


**** 手順
** 書き方を工夫する方法
o AWKにとって無駄な処理が少なくなるように書くと、概ね速くなります。
o 処理系によっては、得意な処理や不得意な処理があります。ですので、特定の処理系に特化して高速化する事も出来ます。
   + 例えば、文字列の連結について、Gawk on Windows 3.1.7では sprintfよりも値を並べる方が速かったです
   + 特定の処理系に特化する方法は、将来のバージョンでも有効とは限りません。

** 時間のかかる部分だけ、他のプログラムを呼び出す方法
o 遅い部分を、その処理が得意なプログラムや言語に任せてしまう方法です。
o 大きく分けて、2種類の方法があります。
o バッチファイル(Windows)やスクリプトから、AWKと他のプログラムを別々に呼び出す方法
   + お手軽なのは、AWKの実行結果をファイルに保存してから、別プログラムにファイルを渡す方法です。
      + 途中でファイルが出来ますので、一部分だけ実行する事も簡単に出来ます。
   + AWKで、他のプログラムを呼び出すバッチファイルを作る事も出来ます。
   + パイプを使って、AWKの処理結果を他のプログラムに渡す事も出来ます。
o AWKの内部から、他のプログラムを実行する方法
   + getline関数を使う方法と、system関数を使う方法があります。

** 速いAWK処理系を使う
o おそらく、mawk系が最速です。日本語を扱う場合は、mawk32が有名です。
   + mawk32の入手方法は「Windows版gawk, mawkを入手する方法
o Gawkから移行する場合、3点に注意します。
   + 文字列操作関数は、1バイトを1文字として数えます。日本語を使う場合は要注意です。
   + 数値計算関数に「有効範囲の限界に近い値」や「想定外の値」を渡すと、強制終了する事があります。
        + 詳しくは「数値計算関数使用時の注意点まとめ
   + Gawkの便利機能や各種文字コード対応機能は、使えなくなります。

** AWKから他言語に、ソースコードを移植する
o 自分で書き換える他、変換補助ツールも出ていました。
o AWK to Perl (a2p) / C (awkaなど) / C++ (An AWK to C++ Translator) を見かけました。
o 詳しくは、「AWKプログラムを他の言語に変換する方法。AWK to Perl, C, C++


**** メモ
o 高速化する事で、処理が分かり難くなる事があります。そのような時は、高速化する利点と欠点を考えて、良くなる方法を検討します。


==
関連ページ:
    ▼AWKプログラムを動かす
    ▼AWKプログラムを書く
    ▼AWK
    ▼制作メモ
    > ▼AWKプログラムを書く
(2010年9月11日追加。参考リンク2点)