xtcal(1)

NAME
xtcal - 項目間およびレコード間の計算

SYNOPSIS
xtcal [-k キー項目名リスト] [-s 並べ換える項目名リスト[%{n|r}]] -c 計算式 -a 新項目名 [-q] [-i 入力ファイル名] [-o 出力ファイル名] [-z] [-t] [-T 作業ディレクトリ名]

DESCRIPTION
計算式で指定した計算をおこなう。

PARAMETERS

-k キー項目名リスト
    計算の単位となる項目名リスト

-s 並べ換える項目名リスト
    キー項目名で指定した単位行の中で、行の順番を決めるための項目名を指定する

-c 計算式
    組み込みの演算子や関数を組み合わせた式を指定する

-a 新項目名
    新たに追加される項目の名前を指定する

-i 入力ファイル名
    入力ファイル名を指定する。ファイル名のサフィックスが.gzであれば自動的に解凍もおこなう。またこのパラメータが省略された時には標準入力がもちいられる。

-o 出力ファイル名
    出力ファイル名を指定する。ファイル名のサフィックスが.gzであれば自動的に圧縮して出力する。またこのパラメータが省略された時には標準出力に出力される。

-T 作業ディレクトリ名
    自動ソートなどで一時的に用いられるファイルを格納するディレクトリ名。

OPTIONS

-q  シーケンシャル処理: -kで指定した項目を単位に処理をするのではなく、入力データのレコード順に従って処理を行う

-z  標準出力の圧縮: 出力ファイルの指定を省略したとき、このフラグを設定すると、標準出力に圧縮して出力される。

-t  plain text: 入出力データの構造として、XMLtableデータ構造でなくplain textを使う。

演算子

 +,-,*,/ : 四則演算 ex) $数量+1
 % : 剰余演算 ex) $数量%4
 <=,<,>=,>,<>,== : 数値比較演算 ex) $数量>=$最大数量
 -le,-lt,-ge,-gt,-ne,-eq: 文字列比較演算 ex)$日付 -lt "19991212"
 =~ : 正規表現による比較演算 ex) $商品名=~"^Baby.*"
 ||,&& : 論理演算 ex) $数量>10 && $金額<1000

関数

 【日付時間関連】
 age(基準日,誕生日): 年齢を計算する
   ex) age("20011210",$誕生日) age($日付,$誕生日)
 datefmt(日付,フォーマット) : 日付をフォーマット変換する
   %Y: 年, %M: 月, %m: 英語月名 %D: 日, %d: 1月1日からの経過日数
   %w: 1月1日を第1週開始日とした週番号, %s: %wで求めた週の開始日付
   %W: 曜日番号, %e: 英語曜日, %E: 曜日番号+英語曜日, %j: 日本語曜日
   %J: 曜日番号+日本語曜日, %%: %を出力
   ex) datefmt($日付,"%Y年%M月%D日")
       datefmt($日付,"%Y/%M/%D(%e)")
 dayadd(日付,日数) : 日付に日数を足した日付を返す
   ex) dayadd($日付,10) dayadd("19991210",15);
 day(日付1,日付2) : 二つの日付間の日数を計算する(日付1-日付2)
   ex) day($日付,"20001230")
 timefmt(時刻,フォーマット) : 時刻をフォーマット変換する
   %H: 時(24時間表記), %h: 時(12時間表記), %e: AM or PM %E: 午前 or 午後
   %M: 分, %S: 秒 %%: %を出力
   ex) timefmt($時刻,"%H時%M分%S秒")
 timeadd(時刻,秒) : 時刻に秒を足した時刻を返す。
   ex) timeadd($日付,$時刻,10)
 time(日付1,時刻1,日付2,時刻2) : 二つの日付時刻間の秒数を計算する(時刻1-時刻2)
   ex) time($最終日付,$最終時刻,$開始日付,$開始時刻)
 now() : 現在の時刻を求める
 today() : 現在の日付を求める
 leapyear(日付) : 日付が閏年なら1、そうでなければ0を返す。
 dt2jd(日付,時刻) : 日付と時刻からユリウス通日を求める。(整数部:BC4712/01/01からの経過日数, 小数部:時刻)
 jd2date(ユリウス通日) : ユリウス通日から日付を求める。
 jd2time(ユリウス通日) : ユリウス通日から時刻を求める。

 【数値関連】
 sum(数値,数値,...) : 数値を合計する
   ex) sum($Quantity*), sum($Price1,$Price2,100);
 sqrt(数値) : 平方根を計算する
 power(数値,指数) : 数値の巾乗を求める
 abs(数値) : 数値の絶対値を求める
 round(数値,基準値) : 基準値の倍数のある範囲内での四捨五入
 up(数値,基準値) : 基準値の倍数のある範囲内での切り上げ
 down(数値,基準値) : 基準値の倍数のある範囲内での切り捨て
 fixdec(数値,小数点以下桁数) : 小数点の桁を揃える
 exp(数値) : eを底とする数値のべき乗
 ln(数値) : 数値の自然対数
 log(数値,底) : 指定の数を底とする数値の対数
 log2(数値) : 2を底とする数値の対数
 log10(数値) : 10を底とする数値の対数
 pi() : πを求める
 rand(最小値,種類数,乱数の種) : 整数の乱数を求める
 nrand(平均値,標準偏差,乱数の種) : 正規分布に基づいた乱数を求める

【文字列関連】
 cat(文字列,文字列,...,トークン) : 文字列をトークンでつなげる
   ex) cat($名字,$名前,"-") cat("名前は",$名前,"")
 length(文字列) : 文字列の長さ(バイト単位)を求める
 fix(文字列,長さ,位置(R,L),詰める文字) : 固定長文字列に変換する。「長さ」を超える文字は切り捨てられる。
 right(文字列,バイト数) : 文字列の右から「バイト数」を切り出す
 left(文字列,バイト数) : 文字列の左から「バイト数」を切り出す
 substr(文字列,位置,バイト数) : 文字列の左から「位置」バイト目から「バイト数」を切り出す
 regexStart(文字列,正規表現) : 正規表現にマッチする開始位置
 regexEnd(文字列,正規表現) : 正規表現にマッチする終端位置
 regexLen(文字列,正規表現) : 正規表現にマッチする文字数

【論理関連】
 if(条件,文字列1,文字列2) : 条件が真のとき文字列1、偽の時文字列2を返す
 not(論理値) : 論理値の否定
 isIn(検索文字列,文字列1,...,文字列n): 検索文字列が文字列1から文字列nの中にあれば真を返す。
 isNull(項目名): 項目の値がNULL値であれば真を返す。

【行項目関連】
 line() : 現在処理中の行番号
 keyLine() : 現在処理中のキー内での行番号
 keyCnt() : 現在処理中のキーの行数
 keyNo() : 現在処理中のキーの連番
 fldCnt() : 項目数
 prvField(項目名) : 指定のキー内で、項目名で指定された前行の値を返す
 topField(項目名) : 指定のキー内で、項目名で指定された先頭行の値を返す
 prvResult() : 指定のキー内で、前行の演算結果を返す
 topResult() : 指定のキー内で、先頭行の演算結果を返す
 lineCmp(項目名1,項目名2,...) : 指定された項目1から項目nについて
        「現在行 > 前行」 ならば1を、
        「現在行 < 前行」 ならば-1を、
        「現在行 = 前行」 ならば0を返す。
   通常、演算子などの記号は、シェルに解釈されてしまうので、シングルクオーツで囲> むこと。項目を指定したい場合は、頭に'$'を付ける。
   項目を正規表現で指定したい場合は$(date*)のように括弧でくくる
   計算式の中で新項目名を指定(ex. $date:Date2)してもヘッダーの項目名は変わらない。

EXAMPLE

 xtcal -c '$金額*$数量' -a 合計金額 -i dat.xt -o rsl.xt

 xtcal -c 'round($金額/$来店回数,0.1)' -a 来店あたり金額 -i dat.xt -o rsl.xt

SEE ALSO
xtcount(1), xtstatistics(1)

WEB PAGE
http://musashi.sourceforge.ne.jp

BUG REPORT
hamuro@adm.osaka-sandai.ac.jp

AUTHORS
Yukinobu Hamuro, Naoki Katoh, Katsutoshi Yada