2010年6月29日火曜日

FS = 読み込んだ行を列に分割する時の区切り文字 - AWK

AWKの文字列操作関数と関連機能 ▲>
AWKの入出力関数とコマンド実行機能 <▲>
○Gawk on Windows ○Gawk ○mawk32 ○Mawk ○awk
読み込んだ行を列に分割する時の、区切り文字です。

o ファイルからの入力の他、split(文字列の分割)でも使います。


**** 書式
--------
FS
もしくは
FS = "読み込み用の列区切り文字"
--------

o FSは変数です。初期値は半角空白1文字(" ")。
o 読み込み用の列区切り文字 -- 正規表現です。前後の「/」は付けず、文字列の形で指定します。例 = "[ \t]"


**** 使用例
--------
BEGIN {
  FS = "[a]";
}
{
  # 例えば、入力行が「ミaク」の時
  print $1 $2 "さん"; # 「ミクさん」
}
--------

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


**** 機能
o 読み込んだ行を列に分割する時の、区切り文字です。
o 初期値は" "、半角空白1文字です。
o 次の時に使われます。
   + 関数を使わずに 1行読み込んだ時(= $1などの値を入れる時に使います)
   + getlineで、読み込んだデータを入れる変数を指定しなかった時(= $1などの値を入れる時に使います)
   + split(文字列の分割)で、区切り文字を指定しなかった時、かつ、この変数に値を代入した時
o Gawkの場合、ファイルから読み込む時に限り、変数FIELDWIDTHSと競合します。Gawkが行を読み込む時、最後に設定した方の値を使います。
o 文字列の形ですが、中身は「/」無しの正規表現で指定します。
o 半角空白以外の1文字だけ指定した時、通常は、[]で括った時と同じ意味になります。
   + FS = "a"; の指定は、FS = "[a]"; と同じです。
   + FS = "\t"; の指定は、FS = "[\t]"; と同じです。\tはタブ文字1文字の意味です。
   + 例外は、original = the one true awkでsplitを使用する時です。
o 半角空白を1文字だけ指定すると、"[ \t\n]+"の指定と同じになります。
   + 空白類が並んでいると、読み飛ばします。
o 空文字("")を指定すると、1文字ずつ取り出す事が出来ます。

** 処理系に依存する動作
o original = the one true awk(updated May 1, 2007)で、splitを使用する時、FSの値に \nの条件が加わります。
   + FS = "a"; の指定は、FS = "[a\n]"; と同じになります。
   + FS = "\t"; の指定は、FS = "[\t\n]"; と同じになります。
   + この動作は、ファイル入力する時とは異なりますので、ご注意下さい。


**** メモ
o original = the one true awk(updated May 1, 2007)の場合、コマンドラインの -F オプションとは動きが異なります。「t」をタブ文字に変換するような事はしません。


**** 確認した処理系
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
    ▼制作メモ
    > OFMT = printを使って数値1つだけを書き出す時の書式
    CONVFMT = 数値を文字列に自動変換する時の書式
    > RS = 1行読み込む時の改行文字
    FILENAME = 現在読み込み中ファイルの名前
    +
    getline = ファイル(やパイプ)から1行読み込む
    split = 文字列を分割する
    IGNORECASE = 文字列比較の時に、大文字小文字を区別させない(Gawk専用)
    FIELDWIDTHS = 固定長ファイルを読み込む為の設定(Gawk専用)
    OFS = printを使って出力する時の列区切り文字
(2010年9月6日追加。空文字を指定した時の動作)

AWKの入出力関数とコマンド実行機能 - AWK

AWKの関数、変数、制御文 ▲
o 「入力 = 読み込み」「出力 = 書き出し」です。

**** 入出力の手引き
入出力とコマンド実行の注意点まとめ
ファイルからデータを読み込む
タブ区切りでファイルを読み込む
▼パターンの書き方は、制御文関連へ
AWKでバイナリ出力する(mawk, Gawk専用)
AWKでバイナリ入力する(Gawk専用)
改行コード。Windows / UNIX / Mac の違いについて
GawkでUTF-8のファイルを読み込む時の注意点
Gawkで、UTF-8のファイルからBOMを除去する
   + Gawkでインターネットアクセスする方法はこちら


**** 組み込み関数
o 入出力する
getline = ファイル(やパイプ)から1行読み込む
print = ファイルなどに書き出す
printf = 文字列を組み立ててファイルなどに書き出す
close = 開いたファイル(やパイプ)を閉じる
fflush = 出力バッファーを空にする

o コマンドを実行する
system = OSのコマンドを実行して、終了コードを返す
   + この他に、getline関数とパイプを併用する方法があります。


**** 関係する変数
o 入出力結果
$0 = 最後に読み込んだデータ、1行分
$1 = 最後に読み込んだデータの1列目
NF = 最後に読み込んだ行の列数
RT = 最後に読み込んだ行の改行文字(Gawk専用)
FNR = 現在読み込み中のファイルから読み込んだ行数
NR = これまでに読み込んだ行数
ERRNO = 入出力系の最新エラーメッセージ (Gawk専用)

o 入出力する為に使う値
FS = 読み込んだ行を列に分割する時の区切り文字。$1, $2に関係します。
FPAT = 読み込んだ行を列に分割する時の列取り出し規則(Gawk専用。バージョン4以降)
RS = 1行読み込む時の改行文字
FILENAME = 現在読み込み中ファイルの名前
ARGV = AWK起動時に指定した入力ファイル名とコマンド名
OFS = printを使って書き出す時の列区切り文字
ORS = printを使って書き出す時の改行文字
OFMT = printを使って数値1つだけを書き出す時の書式
CONVFMT = 数値を文字列に自動変換する時の書式
IGNORECASE = 文字列比較の時に、大文字小文字を区別させない(Gawk専用)
FIELDWIDTHS = 固定長ファイルを読み込む為の設定(Gawk専用)
BINMODE = バイナリモードで読み書きする(mawk,Gawk専用)


**** 関係する固定値
/inet = AWKからインターネットにアクセスする(Gawk専用)
/dev/stdout = 標準出力を示すファイル名
/dev/stderr = 標準エラー出力を示すファイル名
/dev/null = 常に空のファイル名(Gawk専用)
AWKプログラムで使用可能な特殊ファイル名。標準入力、標準出力、標準エラー出力など


**** 関係する演算子
o ファイル入出力
<   = ファイルからの入力
>   = ファイルに出力。上書きモード
>>   = ファイルに出力。後ろに追加
o コマンドとのパイプ
|   = パイプ。左の実行結果を右に渡す
|&   = 双方向通信(Gawk専用)
     + Windows 版 Gawk は、インターネット接続のみ
     + Unix 版 Gawk は、インターネット接続と、同一コマンドへの双方向通信


**** メモ
o mawk系と他のプログラムをパイプで繋ぐ時、「-W interactive」オプションを付けて実行した方が良い場合があります。
   + 何も指定しないと、mawkは、出来るだけ纏めて処理しようとするからです。

入出力とコマンド実行機能のサポート状況
名前Gawk on
Windows
3.1.7
Gawk for
Windows
3.1.6
mawk32
1.3.3
Mawk for
Windows
1.3.3
awk
(May 1,
2007)
説明
入出力  
getline○○○△
(パイプ
不可)
○ファイル(やパイプ)から1行読み込む
print○○○△
(パイプ
不可)
○ファイルなどに書き出す
printf○○○△
(パイプ
不可)
○文字列を組み立ててファイルなどに書き出す
close○○○△
(パイプ
不可)
○開いたファイル(やパイプ)を閉じる
fflush○○○△
(パイプ
不可)
○出力バッファーを空にする
コマンド実行  
system○○○×○OSのコマンドを実行して、終了コードを返す
変数。入力結果  
$0○○○○○最後に読み込んだデータ、1行分
$1△
(注記
あり)
△
(注記
あり)
○○△
(注記
あり)
最後に読み込んだデータの1列目
NF○○○○○最後に読み込んだ行の列数
RT○○×××最後に読み込んだ行の改行文字
FNR○○○○○現在読み込み中のファイルから読み込んだ行数
NR○○○○○これまでに読み込んだ行数
ERRNO○○×××入出力系の最新エラーメッセージ
変数。入出力する為に使う値  
FS○○○○○読み込んだ行を列に分割する時の区切り文字。$1, $2に関係します
RS○○○○○
(1文字
のみ)
1行読み込む時の改行文字
FILENAME○○○○○現在読み込み中ファイルの名前
OFS○○○○○printを使って書き出す時の列区切り文字
ORS○○○○○printを使って書き出す時の改行文字
OFMT○○○○○printを使って数値1つだけを書き出す時の書式
CONVFMT○○○○○数値を文字列に自動変換する時の書式
FIELDWIDTHS○
(文字数)
○
(バイト数)
×××固定長ファイルを読み込む為の設定
BINMODE○○△
(書き出しのみ)
○×バイナリモードで読み書きする


特別なファイル名の一覧
名前Gawk on Windows 3.1.7Gawk for Windows 3.1.6mawk32 1.3.3Mawk for Windows 1.3.3awk (May 1, 2007)説明
入力  
/dev/stdin○○××○標準入力 = コマンドプロンプト画面からの読み込み
/dev/fd/0○○×××標準入力。/dev/stdin と同じです
出力  
/dev/stdout○○○○○標準出力 = コマンドプロンプト画面への書き出し
/dev/stderr○○○○○標準エラー出力 = コマンドプロンプト画面への書き出しその2
/dev/null○○×××どこにも出力しない
/dev/fd/1○○×××標準出力。/dev/stdout と同じです
/dev/fd/2○○×××標準エラー出力。/dev/stderr と同じです
/dev/tty×××××現在表示中のコマンドプロンプト画面に出力。バックグラウンドで使用不可
入力。プロセス情報など取得(非推奨) 
/dev/pid○○×××自分のプロセスID。変数「PROCINFO」の使用を推奨
/dev/ppid×××××親プロセスのID。変数「PROCINFO」の使用を推奨
/dev/pgrpid×××××自分のプロセスのグループID。変数「PROCINFO」の使用を推奨
/dev/user×××××1行にユーザーIDなど4情報。$1 = uid / $2 = euid / $3 = gid / $4 = egid。変数「PROCINFO」の使用を推奨


==
関連ページ:
    ▼AWKの関数、変数、制御文(▼ABC順)
    ▼AWKプログラムを書く
    ▼AWK
    ▼制作メモ
    > ▼AWKのインターネット接続機能(Gawk専用)
    ▼AWKの国際化対応機能 i18n(Gawk専用)
    ▼AWKのパターンと制御文
    +
    ▼AWKの数値計算関数と関連機能
    ▼AWKの文字列操作関数と関連機能
    ▼AWKの時刻取得関数と関連機能

FNR = 現在読み込み中のファイルから読み込んだ行数 - AWK

AWKの入出力関数とコマンド実行機能 ▲
○Gawk on Windows ○Gawk ○mawk32 ○Mawk ○awk
現在読み込み中のファイルから読み込んだ行数です。
o AWKプログラム内でファイルを指定して読み込んだ分は、行数に数えません。

**** 書式
--------
FNR
もしくは
FNR = 行番号
--------

o FNRは変数です。
o 行番号 -- 好きな数字を入れる事が出来ます。
   + 小数点以下のある値を入れると、Gawkは整数に丸めます。


**** 使用例
--------
{
  print "只今、ファイル「" FILENAME "」の " FNR "行目です。ミクさん。";
}
--------

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


**** 機能
o 現在読み込み中のファイルから読み込んだ行数です。
   + パターンに一致しない行も、読み込んでいたら数えます。
   + 途中でexitすると、exit以降読み飛ばした行は数えません。
o AWK実行時に入力ファイルを複数指定した時、現在読み込み中のファイルのみ数えます。
o getlineを使って読み込む場合
   + ファイルを指定せずに読み込んだ分は、行数に数えます。
   + ファイルを指定して読み込んだ分は、行数に数えません。
   + ファイル名に FILENAME (= 読み込み中のファイル名)を指定しても、行数に数えません。

** 処理系に依存する動作
o NR = 1.5 のように、小数点以下を持つ値を設定した場合
   + Gawkは整数に丸めます。この場合は、1になります。
   + mawkとoriginal-awkは、1.5のまま設定します。


**** メモ
o 複数ファイルを読み込んでいて、入力ファイルから読み込んだ行数の合計を知りたい時は、NRを使います。


**** 確認した処理系
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
    ▼制作メモ
    > NR = これまでに読み込んだ行数
    ERRNO = 入出力系の最新エラーメッセージ(Gawk専用)
    FS = 読み込んだ行を列に分割する時の区切り文字
    +
    NF = 最後に読み込んだ行の列数
    FILENAME = 現在読み込み中ファイルの名前
    $0 = 最後に読み込んだデータ、1行分
(2010年8月16日追加。手動更新した場合)

NR = これまでに読み込んだ行数 - AWK

AWKの入出力関数とコマンド実行機能 ▲
○Gawk on Windows ○Gawk ○mawk32 ○Mawk ○awk
これまでに読み込んだ行数です。
o 入力ファイルを複数指定した時、読み込んだ行数の合計になります。
o AWKプログラム内でファイルを指定して読み込んだ分は、行数に数えません。
o 現在読み込み中のファイルから読み込んだ行数を知りたい時は、変数FNRを使います。

**** 書式
--------
NR
もしくは
NR = 行番号
--------

o NRは変数です。
o 行番号 -- 好きな数字を入れる事が出来ます。
   + 小数点以下のある値を入れると、Gawkは整数に丸めます。


**** 使用例
--------
END {
  print "全部で " NR "行読み込みました。ミクさん。";
}
--------

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


**** 機能
o これまでに読み込んだ行数の合計です。
   + パターンに一致しない行も、読み込んでいたら数えます。
   + 途中でexitすると、exit以降読み飛ばした行は数えません。
o AWK実行時に入力ファイルを複数指定した時、今までに読み込んだ行数を合計します。
o getlineを使って読み込む場合
   + ファイルを指定せずに読み込んだ分は、行数に数えます。
   + ファイルを指定して読み込んだ分は、行数に数えません。
   + ファイル名に FILENAME (= 読み込み中のファイル名)を指定しても、行数に数えません。

** 処理系に依存する動作
o NR = 1.5 のように、小数点以下を持つ値を設定した場合
   + Gawkは整数に丸めます。この場合は、1になります。
   + mawkとoriginal-awkは、1.5のまま設定します。


**** 確認した処理系
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
    ▼制作メモ
    > ERRNO = 入出力系の最新エラーメッセージ
    FS = 読み込んだ行を列に分割する時の区切り文字
    RS = 1行読み込む時の改行文字
    +
    FNR = 現在の入力ファイルから読み込んだ行数
    NF = 最後に読み込んだ行の列数
    $0 = 最後に読み込んだデータ、1行分
(2010年8月16日追加。手動更新した場合)