linuxでのちょっとした計算

※実際には12/20のネタです。

■覚えるのが少ない方が良いので、できるだけ、bashのechoで渡したい。
 clispパッケージがCentOS5.7に無かったので。。。

■letの場合(整数)

★余り
$ let x=10%3;echo "$x"
1

★小数点はダメみたい。。。
$ let x=10.1*3
-bash: let: x=10.1*3: syntax error: invalid arithmetic operator (error token is ".1*3")

■bcを使う

★余り
$ echo 10%3 | bc
1

★小数
$ echo "10.1%3" | bc
1.1

★C言語っぽいのはちょっと。。。
$ echo 'for (i=1;i<=100;i++) a+=i;a' | bc
5050

★bash版
$ echo $(for num in `seq 1 100`;do echo -n "${num}+";done;echo "0") | bc
5050

★平方根
$ echo "sqrt(2.00000000000000000)" | bc
1.41421356237309504

■dcを使う

★余り
$ echo '10 3 % p' | dc
1

★小数
$ echo '10.1 3 * p' | dc
30.3

★平方根

$ echo '2.000000000000000 v p' | dc
1.414213562373095

■awkを使う

★余り
$ echo "1" | awk '{print $1*10%3}'
1

★余りを使った割り切れる整数の最大値(1)
$ echo "1" | awk '{print (10-$1*10%3)/3}'

★余りを使った割り切れる整数の最大値(2)
$ echo "1" | awk '{print $1*10%3}' | awk '{print 10-$1/3}'

★余りと、割り切れる整数の最大値の両方を出す
$ echo "1" | awk '{print $1*10%3}' | awk '{print "rest = " $1 "\nans = " (10-$1)/3}'
rest = 1
ans = 3

★小数
$ echo "1" | awk '{print $1*10.1*3}'
30.3

★合計(列計算)
$ for num in `seq 1 100`;do echo "$num"; done | awk '{ sum += $1} END {print sum}'
5050

★合計と平均
$ for num in `seq 1 100`;do echo "$num"; done | \
  awk '{ sum += $1;count++} END {print "sum = " sum "\navg = " sum/count}'
sum = 5050
avg = 50.5

★合計と平均(整数)と余り
$  for num in `seq 1 100`;do echo "$num"; done | \
    awk '{ sum += $1;count++} END {print "sum = " sum "\navg = " (sum-(sum%count))/count "\nrest = " sum%count}'
sum = 5050
avg = 50
rest = 50

★平方根
$ echo "2" | awk '{print sqrt($1)}'
1.41421