動画説明
lcalc
概要
lcalc : 高精度10進演算(整数18桁+小数18桁)を行う。
書式
Usage : lcalc <script> <files>...
Option : --divzero[=<string>]
--overflow[=<string>]
--outdomain[=<string>]
-d
Version : Tue Feb 16 21:38:33 JST 2016
Edition : 1
説明
引数のファイル又は標準入力のテキストデータの各フィールドに対して、
<script> にしたがった演算を行います。<script> では、式、フィールド、
フィールド範囲を単独またはカンマ(,)で区切って複数指定することがで
きます。
式の演算は、整数18桁+小数18桁 の36桁で行われます。式では、定数、NF
(入力フィールド数)、NR(入力レコード数)、組込関数(round() age()
sage() ceil() floor() sqrt())、単項演算(- ! $)、二項演算(+ - * /
% **)、比較(< <= > >= == !=)、論理 AND(&&)、論理 OR(||)、条件
演算(? :)、括弧を使うことができます。冪乗演算子 ** の代わりに ^ を
使うことができます。
$ 演算子は入力のフィールドを表します。オペランドは整数に切り捨てられ
ます。切り捨てられた結果が 1 ~ NF の範囲になければなりません。
丸め関数は、round() 四捨五入、age() 切り上げ、sage() 切り捨て を行い
ます。第1引数の値を、第2引数で指定される桁位置で丸めます。第2引数
は整数定数のみが許されます。第2引数が 0 で始まる場合は整数部分の桁
位置を、0 以外で始まる場合は小数部分の桁位置を示します。例えば、
sage(123.456, 01) は 120.000になり、sage(123.456, 1) は 123.400 にな
ります。
天井関数 ceil()、床関数 floor() は、それぞれ引数を下回らない最小の整
数、引数を上回らない最大の整数を求める関数です。
平方根関数 sqrt() は、平方根を求める関数です。
式の出力形式は 整数部.小数部 です。整数部は必要な桁数(1~18)、小数
部は常に18桁です。ただし、演算結果が整数になる場合は、小数点及び小数
部は表示されません。
論理 AND は、左辺が 0 の場合は結果が 0 になります。左辺が 0 以外の場
合は右辺の値が結果になります。論理 OR は、左辺が 0 以外の場合はその
値が結果になります。左辺が 0 の場合は右辺の値が結果になります。
フィールドは、$式 の形式で、入力のフィールドを表します。式の値は整数
に切り捨てられます。切り捨てられた結果が 0 ~ NF の範囲になければな
まりせん。0 の場合は入力行全体となります。$ 演算子との違いは、数値に
変換されるか、否かです。例えば、スクリプトが '$1, ($2)' で、 入力が
123.456 123.456
の場合、出力は
123.456 123.456000000000000000
となります。
位置を、0 以外で始まる場合は小数部分の桁位置を示します。例えば、
sage(123.456, 01) は 120.000になり、sage(123.456, 1) は 123.400 にな
ります。
天井関数 ceil()、床関数 floor() は、それぞれ引数を下回らない最小の整
数、引数を上回らない最大の整数を求める関数です。
平方根関数 sqrt() は、平方根を求める関数です。
式の出力形式は 整数部.小数部 です。整数部は必要な桁数(1~18)、小数
部は常に18桁です。ただし、演算結果が整数になる場合は、小数点及び小数
部は表示されません。
論理 AND は、左辺が 0 の場合は結果が 0 になります。左辺が 0 以外の場
合は右辺の値が結果になります。論理 OR は、左辺が 0 以外の場合はその
値が結果になります。左辺が 0 の場合は右辺の値が結果になります。
フィールドは、$式 の形式で、入力のフィールドを表します。式の値は整数
に切り捨てられます。切り捨てられた結果が 0 ~ NF の範囲になければな
まりせん。0 の場合は入力行全体となります。$ 演算子との違いは、数値に
変換されるか、否かです。例えば、スクリプトが '$1, ($2)' で、 入力が
123.456 123.456
の場合、出力は
123.456 123.456000000000000000
となります。
フィールド範囲は、$[式1:式2] の形式で、式1 ~ 式2 の連続した入力フィ
ールドを表します。式1 > 式2 の場合、逆順に表示されます。式1、式2 と
もに整数に切り捨てた値が 1 ~ NF の範囲になければなりません。
スクリプトの構成要素間には任意個の空白類(改行文字を含む)を置くこと
ができます。
# から行末まではコメントになります。コメントは空白を置ける場所に置く
ことができます。
除算、剰余算において、右オペランドが 0 の場合は、演算結果が 0 になり
ます。--divzero オプションを指定した場合は、その演算を含む式の計算が
放棄され、オプションで指定された文字列が出力されます。文字列の指定を
省略した場合は div/0 が出力されます。
式の計算でオーバーフローが発生した場合は、lcalc の実行が中止されます。
--overflow オプションを指定した場合は、その式の計算が放棄され、オプ
ションで指定された文字列が出力されて、lcalc の実行が継続されます。文
字列の指定を省略した場合は ovflw が出力されます。
平方根関数の引数や冪乗演算の被演算子が不当な値の場合、lcalc の実行が
中止されます。--outdomain オプションを指定した場合は、その式の計算が
放棄され、オプションで指定された文字列が出力されて、lcalc の実行が継
続されます。文列の指定を省略した場合は outdm が出力されます。
-d オプションを指定すると、ファイルを読み込まず、スクリプトを直接実
行します。この場合、$演算子、フィールド、フィールド範囲は使えません。
例1
通常の使い方
$ cat data
01 埼玉県 91 59 20 76 54.1
01 埼玉県 46 39 8 5 21.2
01 埼玉県 82 0 23 84 10.3
02 東京都 30 50 71 36 30.4
02 東京都 58 71 20 10 6.5
04 神奈川県 92 56 83 96 75.6
$ lcalc '$1, $2, $3 / $4 + $5 * $6' data
01 埼玉県 1521.542372881355932203
01 埼玉県 41.179487179487179487
01 埼玉県 1932
02 東京都 2556.600000000000000000
02 東京都 200.816901408450704225
04 神奈川県 7969.642857142857142857
※1、2フィールドめの指定全体は、$式の形式なので、文字列としてそのまま出力されます。
※3フィールドめの$は、$演算子なので、計算が行われます。
例2
電卓的な使い方
$ lcalc -d '1.23 * 3.45 / 3'
1.414500000000000000