Bash脚本实现多流两列数组合并为索引对齐的结构化表格
解决方案
直接使用Bash+awk组合即可实现需求,代码如下:
# 生成对齐后的表格,如需制表符分隔的结构化数据(更适合后续awk处理),删除末尾的 | column -t 即可 merged_table=$( for i in "${res[@]}"; do echo "$i"; done | awk ' BEGIN { stream_cnt = 0 } /^#/ { stream_cnt++ stream_names[stream_cnt] = substr($0, 2) next } { sec = $1 val = $2 data[sec][stream_cnt] = val all_sec[sec] = 1 } END { # 输出表头,不需要可直接删除以下4行 printf "#Sec\t" for (i=1; i<=stream_cnt; i++) { printf "%s\t", stream_names[i] } printf "\n" # 按秒数升序输出内容 sec_num = asorti(all_sec, sorted_sec, "@ind_num_asc") for (i=1; i<=sec_num; i++) { cur_sec = sorted_sec[i] printf "%s\t", cur_sec for (s=1; s<=stream_cnt; s++) { printf "%s\t", (cur_sec in data && s in data[cur_sec] ? data[cur_sec][s] : "") } printf "\n" } } ' | column -t )
适配说明
- 1050个流、单流100300行的量级完全在awk处理能力范围内,无性能压力
- 如不需要表头,直接删除END块中输出表头的4行代码即可
- 若后续要计算移动平均值,可直接在上述awk脚本的END块中追加计算逻辑,无需将表格存为变量再二次调用awk,进一步提升处理效率
内容的提问来源于stack exchange,提问作者nela
相关产品推荐
相关产品推荐

