これをbashターミナルで使用して、巨大なファイルの平均を取得しました。
awk 'BEGIN{s=0;}{s=s+$2;}END{print s/NR;}' file
出来た。好奇心から(つまり、将来の知識のために)、シェルで計算する一般的な方法について知りたいと思います。R、バッシュ、パイソン...? 速くて汚れていますが、それでも堅牢で高速です。
一般に、expr
単純な算術演算に使用します。
$ expr 3 + 4
7
$ expr 3 '*' 4
12
dc
またはも使用できますbc
。
$ dc -e '3 4 + p'
7
あなたのawk
スクリプトメソッドにも特に問題はありません。私はdc
これを行うには十分ではありませんが、計算を行うために使用できる可能性があります。
$ export DC_COMMANDS="dc script to operate on numbers from file"
$ dc -e "$(cut -d' ' -f2 < file) ${DC_COMMANDS}"
これにより、すべての数値が に渡されdc
、コマンドが実行されます。このコマンドは、数値の合計と除算の命令を実行するために使用できます。
も参照してくださいdc(1)
。
確かにベンチマークする必要がありますが、私の経験では awk (使用したように) は通常、この種のことのスイートスポットです。ネイティブ シェルよりも高速で、perl などのより洗練されたものよりも起動時のオーバーヘッドが少なくなります。そうは言っても、私は純粋なシェルでコーディングするのが好きな傾向があります。
#!/bin/bash
exec <file
declare -i sum=0 count=0
while read a b c; do
(( count++ ))
sum+="${b}"
done
echo $(( sum / count ))
もちろん、整数の結果を探している場合にのみ機能しますが、必要に応じて、いつでも遊んで追加の10進数を取得できます。
echo $(( sum / count )).$(( ((sum * 100) / count) % 100 ))
あなたの質問はテキストファイルの処理に関するものではなく、もっと「一般的に、シェルで計算を行うための最良の方法は何ですか?」だと思います。私が間違っている場合は、私に知らせてください、私は私の答えを消します。
最善の方法はありませんが、単純で柔軟なアプローチは、標準のシェルコマンドであるbcを使用することです。コマンドbcは、任意精度の演算をサポートしています。キーワードを使用して、必要な精度を指定する必要がありますscale
。例えば:
echo "scale=10; 1/3" | bc
.3333333333を印刷します
echo "scale=2; 1/3" | bc
.33を印刷します
スクリプトでは、このように使用します
x=10
result=$(echo "scale=10; $x /5 "|bc)
echo $result
man bc
GNUページの
詳細については、 http ://www.gnu.org/software/bc/を参照してください。