| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- #!/bin/bash
- if [ $# -lt 3 ]; then
- echo "Usage: $0 <csv_file> <class_column> <sum_column1> [<sum_column2> ...]"
- exit 1
- fi
- csv_file="$1"
- class_col="$2"
- shift 2
- sum_cols=("$@")
- if [ ! -f "$csv_file" ]; then
- echo "Error: File '$csv_file' not found!"
- exit 1
- fi
- awk -v class_col="$class_col" -v sum_cols="${sum_cols[*]}" '
- BEGIN {
- FS = ",";
- OFS = ",";
- split(sum_cols, sum_cols_arr, " ")
- num_sum = length(sum_cols_arr)
- # 初始化多维数组(使用SUBSEP组合键)
- delete keys
- }
- {
- # 获取分类键
- key = $class_col
- # 记录唯一分类键
- if (!(key in key_map)) {
- keys[++key_count] = key
- key_map[key] = 1
- }
- # 累加各汇总列
- for (i=1; i<=num_sum; i++) {
- col = sum_cols_arr[i]
- value = $col+0 # 强制转换为数值
- sum[key,i] += value
- count[key,i]++
- }
- }
- END {
- # 输出标题行
- #printf "%s", $class_col
- #for (i=1; i<=num_sum; i++) {
- # printf "%savg(%s)", OFS, sum_cols_arr[i]
- #}
- #print ""
- # 输出汇总结果
- for (k=1; k<=key_count; k++) {
- key = keys[k]
- printf "%s", key
- for (i=1; i<=num_sum; i++) {
- cnt = count[key,i]
- avg = cnt ? sum[key,i]/cnt : 0
- printf "%s%.2f", OFS, avg
- }
- print ""
- }
- }
- ' "$csv_file"
|