average.sh 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #!/bin/bash
  2. if [ $# -lt 3 ]; then
  3. echo "Usage: $0 <csv_file> <class_column> <sum_column1> [<sum_column2> ...]"
  4. exit 1
  5. fi
  6. csv_file="$1"
  7. class_col="$2"
  8. shift 2
  9. sum_cols=("$@")
  10. if [ ! -f "$csv_file" ]; then
  11. echo "Error: File '$csv_file' not found!"
  12. exit 1
  13. fi
  14. awk -v class_col="$class_col" -v sum_cols="${sum_cols[*]}" '
  15. BEGIN {
  16. FS = ",";
  17. OFS = ",";
  18. split(sum_cols, sum_cols_arr, " ")
  19. num_sum = length(sum_cols_arr)
  20. # 初始化多维数组(使用SUBSEP组合键)
  21. delete keys
  22. }
  23. {
  24. # 获取分类键
  25. key = $class_col
  26. # 记录唯一分类键
  27. if (!(key in key_map)) {
  28. keys[++key_count] = key
  29. key_map[key] = 1
  30. }
  31. # 累加各汇总列
  32. for (i=1; i<=num_sum; i++) {
  33. col = sum_cols_arr[i]
  34. value = $col+0 # 强制转换为数值
  35. sum[key,i] += value
  36. count[key,i]++
  37. }
  38. }
  39. END {
  40. # 输出标题行
  41. #printf "%s", $class_col
  42. #for (i=1; i<=num_sum; i++) {
  43. # printf "%savg(%s)", OFS, sum_cols_arr[i]
  44. #}
  45. #print ""
  46. # 输出汇总结果
  47. for (k=1; k<=key_count; k++) {
  48. key = keys[k]
  49. printf "%s", key
  50. for (i=1; i<=num_sum; i++) {
  51. cnt = count[key,i]
  52. avg = cnt ? sum[key,i]/cnt : 0
  53. printf "%s%.2f", OFS, avg
  54. }
  55. print ""
  56. }
  57. }
  58. ' "$csv_file"