- 论坛徽章:
- 93
|
本帖最后由 seesea2517 于 2013-03-29 10:07 编辑
@yjwan
@代号:军刀
@yestreenstars
@w630866139
我觉得要写成一行就不好理解,写成文件来,加点注释应该就好看一点了。
这是一个尝试:- BEGIN {
- OFS = FS
- }
- {
- ar_person_info[$1] = $1 OFS $2 OFS $3 # 看样本,每个人的前三列都是一样的吧,就记录一份人物信息数据
- ar_person_count[$1]++ # 统计某人的出现次数
- refresh_max($1, $4, $5) # 更新某人列四的最大值的信息
- refresh_min($1, $4, $5) # 更新某人列四的最小值的信息
- ar_sum[$1,4] += $4 # 求和某人列四的值
- ar_sum[$1,5] += $5 # 求和某人列五的值
- }
- END {
- for (name in ar_person_count)
- {
- print ar_person_info[name] OFS calc_agv(name, 4) OFS calc_agv(name, 5)
- }
- }
- # 更新某人第四列的最大值的信息
- # 参数:人名,第四列新值,第五列新值
- function refresh_max(name, new_value_4, new_value_5)
- {
- # 若第一次更新,则直接赋值,不需要比较
- if (ar_person_count[name] == 1)
- {
- ar_max[name,4] = new_value_4
- ar_max[name,5] = new_value_5
- return
- }
- # 若新值不大于现有值,则不操作
- if (new_value_4 <= ar_max[name,4])
- return
- # 更新最大值
- ar_max[name,4] = new_value_4
- ar_max[name,5] = new_value_5
- }
- # 更新某人第几列的最小值的信息
- # 参数:人名,第四列新值,第五列新值
- function refresh_min(name, new_value_4, new_value_5)
- {
- # 若第一次更新,则直接赋值,不需要比较
- if (ar_person_count[name] == 1)
- {
- ar_min[name,4] = new_value_4
- ar_min[name,5] = new_value_5
- return
- }
- # 若新值不小于现有值,则不操作
- if (new_value_4 >= ar_min[name,4])
- return
- # 更新最小值
- ar_min[name,4] = new_value_4
- ar_min[name,5] = new_value_5
- }
- # 计算某个人第几列的平均值
- # 对超过 3 个的人做去最大最小值后再求平均值,不超过的直接求平均值
- # 参数:人名,列数
- function calc_agv(name, col)
- {
- # 三次以下的直接求平均值
- if (ar_person_count[name] < 3)
- {
- return ar_sum[name,col] / ar_person_count[name]
- }
- # 三次以上的扣除最大最小值再求平均值
- return (ar_sum[name,col] - ar_max[name,col] - ar_min[name,col]) / (ar_person_count[name] - 2)
- }
复制代码 要说我觉得C/C++是比较好读的一种代码了,不过要是写成这样,那也是难懂啊(开个玩笑,这自然不是字面意义上的C/C++,当然要把好读的程序改成难懂的那不是相当容易嘛,而且还有现成的代码混淆器):
@cjaizss
++++++++++[>++++++++++[>+<-]<-]>>-.+++++++.---------.++++++++.>>++++[<++++[<+>-]>-]<<+.-------.. |
|