豚吐露@wiki

巨大なcsvファイルで与えられた数値の平均を求めたい

最終更新:

ohden

- view
管理者のみ編集可

巨大なcsvファイルで与えられた数値の平均を求めたい

Linux Mint 14
bash 4.3.11

表題のような問題がstackoverflowに出てたのでちょっと作ってみた。

e.g.) csvAve.sh
  1. #!/bin/bash
  2.  
  3. IFS=$','
  4. BC=/usr/bin/bc
  5.  
  6. function getAve(){
  7. sum0=0
  8. sum1=0
  9. cnt0=0
  10. cnt1=0
  11.  
  12. while read line; do
  13. col=(`echo "${line}"`)
  14.  
  15. if [ -n "${col[0]}" ]
  16. then
  17. sum0=`echo "${col[0]} + ${sum0}" | ${BC}`
  18. cnt0=`echo "${cnt0} + 1" | ${BC}`
  19. fi
  20.  
  21. if [ -n "${col[1]}" ]
  22. then
  23. sum1=`echo "${col[1]} + ${sum1}" | ${BC}`
  24. cnt1=`echo "${cnt1} + 1" | ${BC}`
  25. fi
  26. done < $1
  27.  
  28. ave0=`echo "${sum0} / ${cnt0}" | ${BC}`
  29. ave1=`echo "scale=8; ${sum1} / ${cnt1}" | ${BC}`
  30. echo ${ave0}, ${ave1}
  31. }
  32.  
  33. sum=0
  34. for path in "$@"; do
  35. ave=(`getAve ${path}`)
  36. sum=`echo "${ave[1]} + ${sum}" | ${BC} `
  37. echo "${path}: ${ave[0]} ${ave[1]}"
  38. done
  39.  
  40. echo "ave: `echo "scale=8; ${sum} / $#" | ${BC}`"

bcがどこまでの値に耐えられる仕様なんか分からんのが問題ですが...
上記を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秒

名前:
コメント:

すべてのコメントを見る
添付ファイル
記事メニュー
ウィキ募集バナー