基于其他列获取目标列的最小值与最大值问题
按分组列获取指定列的最小/最大值解决方案
看起来你需要按第三列(分组ID)聚合数据,提取其他列的最小和最大值对吧?我推荐用awk处理这种结构化文本统计,它简单高效,不需要复杂的工具链。
第一步:格式化原始输入数据
你给出的原始数据是连续的空格分隔值,首先我们把它按每5个字段拆分成每行(从数据结构看,每行应该是5个字段):
# 将连续数据转换为每行5个字段的格式 echo "338043.75 2395256.25 36301 38676 1296 338056.25 2395256.25 36301 38677 1296 338068.75 2395256.25 36301 38678 1296 338081.25 2395256.25 36301 38679 1296 338043.75 2395256.25 36302 38676 1296 338056.25 2395256.25 36302 38677 1296 338068.75 2395256.25 36302 38678 1296 338081.25 2395256.25 36302 38679 1296 338043.75 2395256.25 36303 38676 1296 338056.25 2395256.25 36303 38677 1296 ..." | awk '{for(i=1;i<=NF;i++){printf "%s ",$i;if(i%5==0)print ""}}' > formatted_data.txt
处理后的数据会变成规范的每行5字段格式:
338043.75 2395256.25 36301 38676 1296 338056.25 2395256.25 36301 38677 1296 338068.75 2395256.25 36301 38678 1296 338081.25 2395256.25 36301 38679 1296 338043.75 2395256.25 36302 38676 1296 ...
第二步:按分组统计最小/最大值
下面的awk脚本会按第三列(分组ID)聚合,统计第一列和第四列的最小、最大值,你可以根据需求修改为其他列:
awk '{ # 以第三列作为分组标识 group = $3 # 更新第一列的最小/最大值 if (!min_col1[group] || $1 < min_col1[group]) min_col1[group] = $1 if (!max_col1[group] || $1 > max_col1[group]) max_col1[group] = $1 # 更新第四列的最小/最大值 if (!min_col4[group] || $4 < min_col4[group]) min_col4[group] = $4 if (!max_col4[group] || $4 > max_col4[group]) max_col4[group] = $4 } END { # 输出统计表头 printf "%-10s %-15s %-15s %-15s %-15s\n", "分组ID", "第1列最小值", "第1列最大值", "第4列最小值", "第4列最大值" # 遍历所有分组,输出统计结果 for (g in min_col1) { printf "%-10d %-15.2f %-15.2f %-15d %-15d\n", g, min_col1[g], max_col1[g], min_col4[g], max_col4[g] } }' formatted_data.txt
脚本说明
- 用数组
min_col1、max_col1存储每个分组下第一列的最小/最大值,同理处理第四列 END块在所有行处理完成后执行,负责格式化输出统计结果- 如果需要统计其他列(比如第二列),只需添加对应的
min_colX和max_colX判断逻辑即可
示例输出
针对你提供的示例数据,运行脚本后会得到如下结果:
分组ID 第1列最小值 第1列最大值 第4列最小值 第4列最大值 36301 338043.75 338081.25 38676 38679 36302 338043.75 338081.25 38676 38679 36303 338043.75 338056.25 38676 38677
内容的提问来源于stack exchange,提问作者OXXO
相关产品推荐
相关产品推荐

