豚吐露@wiki
巨大なcsvファイルで与えられた数値の平均を求めたい
最終更新:
ohden
-
view
巨大なcsvファイルで与えられた数値の平均を求めたい
Linux Mint 14
bash 4.3.11
bash 4.3.11
表題のような問題がstackoverflowに出てたのでちょっと作ってみた。
e.g.) csvAve.sh
- #!/bin/bash
-
- IFS=$','
- BC=/usr/bin/bc
-
- function getAve(){
- sum0=0
- sum1=0
- cnt0=0
- cnt1=0
-
- while read line; do
- col=(`echo "${line}"`)
-
- if [ -n "${col[0]}" ]
- then
- sum0=`echo "${col[0]} + ${sum0}" | ${BC}`
- cnt0=`echo "${cnt0} + 1" | ${BC}`
- fi
-
- if [ -n "${col[1]}" ]
- then
- sum1=`echo "${col[1]} + ${sum1}" | ${BC}`
- cnt1=`echo "${cnt1} + 1" | ${BC}`
- fi
- done < $1
-
- ave0=`echo "${sum0} / ${cnt0}" | ${BC}`
- ave1=`echo "scale=8; ${sum1} / ${cnt1}" | ${BC}`
- echo ${ave0}, ${ave1}
- }
-
- sum=0
- for path in "$@"; do
- ave=(`getAve ${path}`)
- sum=`echo "${ave[1]} + ${sum}" | ${BC} `
- echo "${path}: ${ave[0]} ${ave[1]}"
- done
-
- echo "ave: `echo "scale=8; ${sum} / $#" | ${BC}`"
bcがどこまでの値に耐えられる仕様なんか分からんのが問題ですが...
上記をcsvAve.shとして、添付のようなcsvを与えると平均を出してくれます。
上記をcsvAve.shとして、添付のようなcsvを与えると平均を出してくれます。
$ ./csvAve.sh data1.csv data2.csv
data1.csv: 102585 .07345325
data2.csv: 100968 .07338210
ave: .07341767
更新日: 2015年01月21日 (水) 21時23分48秒