ちょっと計算したいときのオラ電卓選手権

25841 ワード

テキストを入力しているとき「四則演算、基数変換、日時(UNIX 時間、時差など)、単位変換」などの計算をしたくなることがあります。

そんなときの「各種ツールを電卓的に利用する方法」を列挙していきます。

  • CLI

    • bc - 四則演算、基数変換など
    • Node.js - 四則演算、配列操作、UNIX 時間(ms)など
    • awk - 集計など
    • jq - 単位変換、文字列のバイト数、時間関連(UNIX 時間操作)など
  • エディター

    • Vim(filter) - CLI ツールとの組み合わせ
  • GUI

    • calc.exe - 四則演算、基数変換など
    • Google(検索) - 時差など

なお、タイトルのオラ電卓はオラザクを元にした造語です。とくに深い意味はないのでスルーしていただければと。

CLI

bc - 四則演算、基数変換など

ターミナルを使っているときは bc を使うことが多いです。

基本的な使い方はシンプルでコマンドラインから bc を実行するとその後に入力した式を計算してくれます。終了は quitCtrl + d です。

実際に使うときは、tmux で新しい pane を開いて bc で計算し(必要であればコピーして)閉じる感じです。

図 1-1 基本的な操作

$ bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
10+20*3-5
65
quit

last 変数には直前の結果が代入されています。

図 1-2 直前の結果

$ bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
100*20
2000
last-100
1900

scale で小数点の桁数を指定できます(が、四捨五入などは面倒なのでその辺が必要なときは別の方法にしています)。

図 1-3 小数点の表示

$ bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
5/2
2
scale=1
5/2
2.5

obase=16 を使うと 16 進数で表示されます。

図 1-4 16 進数表示

$ bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
obase=16
10+20
1E
A+1
B

ibase=16 を使うと 16 進数で入力できます(アルファベットは大文字)。なお、この状態から 10 進数入力に戻すには ibase=A となります。この辺はこんがらがってきたらいったん終了してしまいます。

図 1-5 16 進数入力

$ bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
10
10
ibase=16
10
16
A
10
a
0
ibase=A
10
10

パイプで式を渡すこともできます。コマンドラインからはあまり使いませんが、後述の Vim の filter ではよく使います。

図 1-6 パイプで式を渡す

$ echo "10 * 20" | bc
200

Node.js(REPL) - 四則演算、UNIX時間(ms)など

VSCode の Remote Container でターミナルを使っているときに「bc はインストールされていないけど node は動く」という場合などで利用しています。

コマンドラインから node を実行し式を入力(Enter)すれば結果が表示されます。直前の結果は _ にセットされています。終了は Ctrl + d です。

以下ではわかりにくいですが、実際の操作では「補完の候補」「確定している情報での結果」を表示してくれるのが便利です。

図 2-1 基本的な操作

$ node
Welcome to Node.js v16.14.2.
Type ".help" for more information.
> 10+20*3-5
65
> _-10
55
>
$

普通に四捨五入などもできます。

図 2-2 四捨五入

$ node
Welcome to Node.js v16.14.0.
Type ".help" for more information.
> 5/2
2.5
> Math.round(5/2)
3

UNIX 時間(ms)と日時を変換するときにも利用しています(が、最近は後述の jq を使うことが増えています)。

図 2-3 Date による日時操作

$ node
Welcome to Node.js v17.9.0.
Type ".help" for more information.
> Date.now()
1651659937086
> new Date(_).toString()
'Wed May 04 2022 19:25:37 GMT+0900 (日本標準時)'

Node.js らしい利用も可能。

図 2-4 配列

$ node
Welcome to Node.js v16.14.2.
Type ".help" for more information.
> [1,2,3,4,5].map(v=>v*10)
[ 10, 20, 30, 40, 50 ]

ただし、表示されるのは式の結果なので splice で配列の操作結果を確認するような場合は変数に代入しておく必要があります[1]

図 2-5 変数の利用

$ node
Welcome to Node.js v16.14.2.
Type ".help" for more information.
> [1,2,3,4,5].splice(1,1,20)
[ 2 ]
> let a=[1,2,3,4,5]
undefined
> a.splice(1,1,20)
[ 2 ]
> a
[ 1, 20, 3, 4, 5 ]

関数などのブロックは複数行で入力できます。

図 2-6 ブロックの入力

$ node
Welcome to Node.js v16.14.0.
Type ".help" for more information.
> function add(a,b){
... return a+b
... }
undefined
> add(10,20)
30
> if(add(10,20)>100){
... console.log('>100')
... }else{
... console.log('<=100')
... }
<=100
undefined

インタラクティブな入力以外では node -e でも式を評価できます。 -p を指定すると結果を表示します。

図 2-7 引数による評価

$ node -e '10+20*3-5'

$ node -e 'console.log(10+20*3-5)'
65

$ node -p -e '10+20*3-5'
65

awk - 集計など

awk は複数の値の合計を求めるときに使っています。方法としては awk '{sum+=$1} END{print sum}' を実行した後に数値を貼り付けて、最後に Ctrl + d といった感じです。

図 2-8 awk で合計

$ awk '{sum+=$1} END{print sum}'
# 標準入力待ちになるので以下を貼り付ける
10
20
30
# ここで Ctrl + d を押下
60

awk '{sum+=$1} END{exit sum}' とすることで結果を終了コードにできます(整数の場合)。awk 側のコードを変更せず一捻り加えたいときに扱いやすいです。

図 2-9 結果を終了コードにする

$ awk '{sum+=$1} END{exit sum}'
# 標準入力待ちになるので以下を貼り付ける
10
20
30
# ここで Ctrl + d を押下し、以下を実行
$ expr 100 - "${?}"
40

集計以外に簡易的な変換ツールの定義としても使えます。同じ計算を連続して行う場合、少し楽になります(が、最近は後述の jq を使うことが多いです)。

図 2-10 変換ツールとして定義

$ alias f2m="awk '{print \$1/3.281}'"

$ f2m
1
0.304785
12
3.65742

この他にも「awk ワンライナー」などで検索すると平均を求める方法などいろいろでてきます。