2010年6月19日土曜日

AWKプログラムを別ファイルに書いて実行する方法 - AWK

AWKプログラムを動かす
○Gawk on Windows ○Gawk ○mawk32 ○Mawk ○awk
AWKでは、AWKプログラムを別ファイルに書いて、間接的に実行する事も出来ます。
「-f」オプションを使います。

2行以上のプログラムを書いたり、AWKプログラムをUNIXと同じように書きたい時に、便利です。


**** 実行例(Gawkの場合)
o コマンドプロンプト画面、もしくはバッチファイルなどを使って実行します。
   + コマンドを直接入力したい時は「コマンドプロンプト画面を開く方法
   + 簡単実行したい時は「バッチファイル。コマンドを纏めてファイルにする方法

o 実行コマンドの例
----------------
gawk -f sample.awk in.txt
----------------

   + ファイル「sample.awk」と「in.txt」は、下の手順に従って事前に用意します。
   + 実行プログラムやファイルが見つからない時は、フルパス(= 完全な書き方)で指定します

o sample.awk の内容例
----------------
{
  print $1 "。こんにちは。";
}
----------------

o エクスプローラーで表示した時に拡張子を変更出来ない時、というよりも拡張子が表示されていない時は、設定を変更する必要があります。詳しくは「ファイルの拡張子を変更可能にする方法

o in.txt の内容例
----------------
ミクさん
リンちゃん
レン君
ルカ様
----------------



**** 確認した処理系
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プログラムを動かす
    ▼AWK
    ▼制作メモ
    > 標準出力とエラー出力。AWKプログラムの出力結果をファイルに書き出す
    沢山の入力ファイルを簡単に処理する
    AWKのバージョンを確認する
    AWKプログラムを、コマンドプロンプト画面に直接書いて実行する(Windows)
    ▼AWKプログラムを書く
(2010年9月29日追加。拡張子変更手順へのリンク)

AWKプログラムを、コマンドプロンプト画面に直接書いて実行する方法(Windows) - AWK

AWKプログラムを動かす
○Gawk on Windows ○Gawk ○mawk32 ○Mawk ○awk
AWKプログラムは、Windowsのコマンドプロンプト画面上に書いて、直接実行する事も出来ます。
引用符の使い方がUNIXと違いますので、気を付けます。

o 実行例(Gawkの場合)
----------------
gawk "BEGIN { print \"こんにちは。ミクさん。\"; }"
----------------

(入力ファイルがある時は、最後の「"」の後ろに、半角空白、入力ファイル名の順で追加します。)
(実行プログラムやファイルが見つからない時は、フルパス(= 完全な書き方)で指定します。)

**** Windowsのコマンドプロンプト画面に直接書く時の確認点
** 引用符について
o 一番外側の引用符は、「"」(= 二重引用符)を使います。
o 内側にも引用符(「"」や「'」)がある時は、「\"」に置き換えます。
o 「'」(= 一重の引用符)は引用符ではなく、単なる文字扱いになります。
   + 例外は、Mawk for Windows 1.3.3。この処理系は、「'」(= 一重の引用符)を「"」(= 二重引用符)に変換してから実行します。
o 詳しくは、「コマンドに、空白の入った引数(パラメーター)を渡す方法 - コマンドプロンプト画面

** UNIX特有の書き方について
o 内部でUNIXのコマンドを呼び出している時は、その部分が動きません。
   + Windowsでも動くように、コマンドを使っている部分を置き換えます。
   + もしくは、Windows上にUNIX実行環境を構築して、その上で動かします。Cygwinが有名です。


**** UNIXの実行例を置き換える時の手順
o 次のように置き換えます。
   + 一番外側に使う引用符を、「"」(= 二重引用符)
   + 内側で使う全ての引用符を、「\"」(\付きの二重引用符)
o 既に「\」が付いている引用符がある時は、変更が必要かどうか考えて下さい。


**** メモ
o AWKは、1行で書く実用的なプログラムが、世界中で公開されています。
o 興味のある方は、Web検索。検索キーワードは、「awk 1行野郎」「awk one liner」辺りがおすすめです。


**** 確認した処理系
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プログラムを動かす
    ▼AWK
    ▼制作メモ
    > AWKプログラムを別ファイルに書いて実行する
    標準出力と標準エラー出力。AWKプログラムの出力結果をファイルに書き出す
    沢山の入力ファイルを簡単に処理する
    ▼AWKプログラムを書く

コマンドプロンプト画面で、コマンドに、空白の入った引数(パラメーター)を渡す方法 - Windowsのコマンドプロンプト(bat,cmd)

コマンドプロンプト画面で、コマンドやファイル名を入力する
○Windows XP
引数(パラメーター)の外側を「"」(= 二重引用符)で括ります。
o 内側に「"」がある時は、「\"」で置き換えます。
   + (「\」は、日本語環境では半角の円マーク。英語環境では半角のバックスラッシュ「\」(= これは全角)です。)


**** 原理
o コマンドプロンプトは、通常、半角空白があると引数の区切りと解釈します。
----------------
sample.bat param1 param2
----------------

o 「"」で囲むと、「"」から次の「"」までを1つの引数だと解釈します。
----------------
sample.bat "param1 param1だよ" param2
----------------

o 例外もあります。「\"」。この場合は単なる文字列です。途中の「"」を引数に含めたい時に、使われています。
----------------
sample.bat "param1 \"param1です\" param1だよ" param2
----------------

**** メモ
o 「'」(= 一重の引用符)は、単なる文字扱いです。UNIX使いの方は、ご注意下さい。
o この例の場合、呼ばれたバッチファイル側では、%1 の代わりに %~1 を使うと、前後の「"」が無い状態で引数を受け取る事が出来ます。
   + 詳しい情報は、コマンドプロンプト画面で「help call」。
   + callコマンドは、バッチファイル内から、他のバッチファイルを呼び出す時に便利です。


**** 確認したバージョン
o Windows XP Service Pack 3


==
関連ページ:
    ▼コマンドやファイル名を入力する
    ▼コマンドプロンプト画面の使い方
    ▼コマンドプロンプト画面
    ▼制作メモ
    > ▼コマンドを実行する
    +
    ファイルやフォルダーのパスを簡単に入力する

数値計算関数使用時の注意点まとめ - AWK

AWKの数値計算関数と関連機能
**** 処理系共通の注意点
o 表示する値の精度は、処理系によって異なります。でも、内部的には同じ精度になっているみたいです。
   + 表示の桁数が少ない時は、printfsprintfなどを使って、書式付きで値を表示してみます。
o 計算結果が 0に近い時、計算誤差が上位桁に上ってきている事があります。
   + 必要に応じて、計算結果を丸めたり、計算方法を工夫します。
o 数値比較などの場面で、値を文字列だと認識されてしまった時は、値の後ろに「 + 0」を追加すると数値化出来ます。

o この他、数値計算そのものには関係がありませんが、有効数字7桁以上を扱う場合、数値の表示桁数を伸ばしておくと、ストレスが溜まりません。
   + 例えば、数値の最大表示桁数(及び、文字列に自動変換する時の最大桁数)を10桁に変更する場合
--------
BEGIN {
  OFMT = "%.10g";
  CONVFMT = "%.10g";
(以下、必要な処理)
}
--------

   + 詳しくは、「数値から文字列にする時に、実数を7桁以上表示させる方法
   + なお、AWKの数値計算時の有効数字は、最大15桁程度です(= 32ビットOS用にコンパイルした場合)。それよりも長く表示させても、あまり意味がありません。


**** 特定の処理系に関する注意点
** Gawk系特有の動作
o 一部の関数を呼び出す時、注意点があります。(exp / rand
o srand関数で種を指定すると、整数部分だけ使います。

** mawk系特有の動作
o 有効範囲外の値について、関数呼び出し前のチェックが必要になる事があります。
   + 「有効範囲の限界に近い値」や「想定外の値」が入ると、AWKプログラムを強制終了する関数がありました。(log。mawk MBCS (32bit版) 1.3.3の場合は、次の関数も追加。sqrt / exp

** オリジナルAWK特有の動作
o 不正な値を指定して連続で呼び出すと、返す値が変わる関数がありますので、注意します(sqrt / log)。
o この他、srand関数の戻り値が、他の処理系と異なります。


==
関連ページ:
    ▼AWKの数値計算関数と関連機能▼ABC順
    ▼AWKプログラムを書く▼ABC順
    ▼AWK
    ▼制作メモ
    > 数値から文字列にする時に、実数を7桁以上表示させる方法
    AWKプログラムの中で、8進数や16進数を使う方法
    int = 実数や文字列を整数化する
    +
    配列を使う時の注意点まとめ
(2010年8月18日追加。数値の表示桁数を増やす方法)
(2010年6月22日追加。オリジナルAWKで値が変化する条件)