2010年6月30日水曜日

NF = 最後に読み込んだ行の列数 - AWK

AWKの入出力関数とコマンド実行機能
○Gawk on Windows ○Gawk ○mawk32 ○Mawk ○awk
最後に読み込んだ行の列数です。
o AWKは1行読み込むと、自動的に列に分割して、$1、$2、$3、、、に値を入れます。
o 行全体のデータは、$0に入っています。

**** 書式
--------
NF
--------

o NFは変数です。


**** 使用例
--------
{
  for (i = 1; i <= NF; ++i) {
    print $i "、おはようございます。";
  }
}
--------

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

o 入力データ
--------
ミクさん リンちゃん レン君 ルカ様
--------



**** 機能
o 最後に読み込んだ行の列数です。
   + 列の区切り文字は、通常「半角空白、タブ(、改行文字)」ですが、FSで変更出来ます。
o この変数に値を代入すると、$0の値を自動変更(= 再構築)する処理系があります。
   + mawk, Gawkで列数を調整したい時に便利です。
o また、この変数に負の値にすると、強制終了する処理系があります。

o 次の操作は、NFの値を変更します。
   + 関数を呼び出さずに、1行読み込んだ時
   + getlineを、引数無しで呼び出した時
   + $0、$1など変数「$ + 数字」に値を代入した時
      + $0を更新した時は、自動的に$1などとNFが再設定されます。
      + $1など、数字が1以上の時は、その数字が NFよりも大きなときに限り、NFにその数字を設定します。
      + $1 = $1のように同じ値を代入しても、同じ動きをします。
   + NFの値を直接上書きした時


** 処理系に依存する動作
o この変数に値を代入した時、$0の値を自動変更(= 再構築)する処理系
   + Gawk on Windows 3.1.7
   + Gawk for Windows 3.1.6
   + mawk MBCS (32bit版) 1.3.3
   + Mawk for Windows 1.3.3
   + この時、各列の間にある区切り文字を、変数OFSの値で置き換えます。
   + NF = NFのように同じ値を代入しても、同じ動きをします。
   + これらの処理系では、NFを負の値にすると、強制終了します。
o この変数に値を代入した時、$0の値を変更しない処理系
   + original = the one true awk(updated May 1, 2007)
   + この処理系では、NFの値が負になっても、$0の値を参照する事が出来ます。


**** メモ
o 最後の列のデータを取り出す時は、$NF と書く方法が簡単です。


**** 確認した処理系
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
    ▼制作メモ
    > RT = 最後に読み込んだ行の改行文字
    FNR = 現在読み込み中のファイルから読み込んだ行数
    NR = これまでに読み込んだ行数
    +
    ファイルからデータを読み込む
    $0 = 最後に読み込んだデータ、1行分
    $1 = 最後に読み込んだデータの1列目
(2010年9月9日追加。$0や$1との関係と負の値)

AWK本家のホームページの場所 - AWK

AWKを入手する
最新版に関する情報が最も早いのは、本家のページです。全て英語です。

** オリジナルawk
▽The AWK Programming Language
   + AWKを開発したチームが公開している、AWKのホームページです。
   + Windows版の実行ファイルも配布中です。
   + 仕様や使い方は、書籍として出版されています。

** nawk
▽newest Awk (nawk)
   + AWK言語開発者の一人が公開している、the one true awkの最新版です。
   + オリジナルawkに対して、不具合修正が入っているみたいです。

** mawk
Debian 安定板(squeeze)の mawk パッケージ
   + 最も高速に動くawk処理系です。
   + おそらく、こちらが最新版。
▽mawk - pattern scanning and text processing language
   + mawkの改良を行っている方のページです。(mawk開発者とは別の方です)

** Gawk
▽Gawk - GNU Project - Free Software Foundation (FSF)
   + 高機能です。おそらく、最も人気があるawk処理系です。
   + ▽説明書はこちらです


==
関連ページ:
    ▼AWKを入手する
    ▼AWK
    ▼制作メモ
    > ▼AWKプログラムを動かす
    AWKの種類と特徴
    Windows 版gawk, mawkを入手する
(2011年7月21日追加。nawk)

system = OSのコマンドを実行して、終了コードを返す - AWK

AWKの入出力関数とコマンド実行機能
○Gawk on Windows ○Gawk ○mawk32 ×Mawk ○awk
OSのコマンドを実行して、終了コードを返します。

**** 書式
--------
system( [実行するコマンド] )
--------

o 実行するコマンド -- 文字列の形で指定します。


**** 使用例(Windowsの場合)
o UNIXの方は、"date /t"の部分を、"ls"などに置き換えてみて下さい。
--------
BEGIN {
  v = system("date /t");
  print "コマンドのリターンコード = (" v ")";
}
--------

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


**** 機能
o OSのコマンドを実行して、終了コードを返します。
o 但し、systemをサポートしていない処理系があります。
   + Mawk for Windows 1.3.3では、実行せずに、終了コード(127)を返します。(= Windows XP SP3で確認)


**** メモ
o コマンドを実行する方法は、他にもあります。getlineでパイプを実行する方法です。


**** 確認した処理系
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
    ▼制作メモ
    > $0 = 最後に読み込んだデータ、1行分
    $1 = 最後に読み込んだデータの1列目
    NF = 最後に読み込んだ行の列数
    +
    exit = 終了する

FILENAME = 現在読み込み中ファイルの名前 - AWK

AWKの入出力関数とコマンド実行機能
○Gawk on Windows ○Gawk ○mawk32 ○Mawk ○awk
現在読み込み中ファイルの名前です。
o これから読み込むファイル名を変更したい時は、ARGVARGCを変更します。

**** 書式
--------
FILENAME
--------

o FILENAMEは変数です。
o FILENAMEの値を変更する事も出来ますが、AWKの動作は変わりません。


**** 使用例
--------
{
  print "只今、ファイル [" FILENAME "]の、" FNR "行目を読み込みました。";
}
--------

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


**** 機能
o 現在読み込み中ファイルの名前です。
o 標準入力から読み込んだ時、名前は「-」になります。例えば、
   + 入力ファイル名を指定せず、入力内容を手入力する場合
   + パイプを使って、他のコマンドの出力結果をawkプログラムに渡す場合
o getlineを使って別のファイル(やパイプ)を開いても、FILENAMEの値は変わりません。
o FILENAMEの値を変更しても、読み込み中ファイルは切り替わりません。


**** 確認した処理系
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
    ▼制作メモ
    > ARGV = AWK起動時に指定した入力ファイル名とコマンド名
    OFS = printを使って書き出す時の列区切り文字
    ORS = printを使って書き出す時の改行文字
    +
    FNR = 現在の入力ファイルから読み込んだ行数
    ARGC = ARGVに入っている要素の個数
    ARGIND = ARGVにおける現在入力中ファイルの位置(Gawk専用)
(2010年8月15日追加。手動更新した場合)

RS = 1行読み込む時の改行文字 - AWK

AWKの入出力関数とコマンド実行機能
○Gawk on Windows ○Gawk ○mawk32 ○Mawk ○(1文字のみ)awk
ファイル(やパイプ)から1行読み込む時の、改行文字です。

**** 書式
--------
RS
もしくは
RS = "改行文字"
--------

o RSは変数です。初期値は改行文字("\n")。
o 改行文字 -- 正規表現です。前後の「/」は付けず、文字列の形で指定します。例 = "[\r\n]+" (空行を読み飛ばす書き方)


**** 使用例
--------
BEGIN {
  RS = "+";
}
{
  # 例えば、入力ファイルが「ミクさん+リンちゃん+レン君+ルカ様」の時
  print $0 ; # 最初の行は「ミクさん」
}
--------

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


**** 機能
o ファイル(やパイプ)から1行読み込む時の、改行文字です。
o 初期値は改行文字("\n")です。
o 1文字だけ指定した時、全ての処理系で同じように動きます。
   + その動きは、正規表現に例えると、[]で括った時と同じです。
   + RS = "a"; の指定は、RS = "[a]"; と同じです。
   + RS = "\t"; の指定は、RS = "[\t]"; と同じです。\tはタブ文字1文字の意味です。
   + RS = " "; の指定は、RS = "[ ]"; と同じです。FSの時とは違います。
   + RS = ""; (= 空文字)の指定は、RS = "[\n][\n]"; と同じです。改行文字が2つ並ぶまでを1行とします。
      + 改行2つは、インターネットの通信で良く使われている記号です。


** 処理系に依存する動作
o mawk系、Gawk系の場合
   + 文字列の形ですが、中身は「/」無しの正規表現で指定します。
   + 2文字以上指定する事が出来ます。
o original = the one true awk(updated May 1, 2007)の場合
   + 常に、先頭の1字のみで判断します。
   + RS = "[\t];" と指定すると、先頭の「[」を行の区切り文字だと判断します。


**** メモ
o RS の値変更機能は、XMLや JavaScriptを扱う時に重宝しています。

o バックアップXMLや強力なJavaScriptライブラリは、処理の単純化やファイルサイズ縮小などの目的で、改行コードを必要最小限に抑えたり除去する事が良くあります。
o それらのデータを解析したり加工したい時、そのままの状態で開いても読み難いです。
o そこで、RSで行区切り文字(例えば、RS = ">")を設定して改行コードを加えると、読み易い形式に変換する事が出来ます。データ加工でタグを切り出す時にも、便利です。
o 具体例は「Bloggerのエクスポートファイルからテンプレートを取り出す方法


**** 確認した処理系
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) -- 最初の1文字のみ有効


==
関連ページ:
    ▼AWKの入出力関数とコマンド実行機能▼ABC順
    ▼AWKプログラムを書く▼ABC順
    ▼AWK
    ▼制作メモ
    > FILENAME = 現在読み込み中ファイルの名前
    ARGV = AWK起動時に指定した入力ファイル名とコマンド名
    OFS = printを使って書き出す時の列区切り文字
    +
    getline = ファイル(やパイプ)から1行読み込む
    FS = 入力行を列に分割する時の区切り文字
    RT = 最後に読み込んだ行の改行文字(Gawk専用)
    FIELDWIDTHS = 固定長ファイルを読み込む為の設定(Gawk専用)
    ORS = printを使って書き出す時の改行文字
(2010年9月29日追加。メモ欄にてRSの便利な使い方)
(2010年9月7日変更。\n指定時の動作が間違っていたので削除。空文字指定時の動作を追加。)