如何在Bash中合并矩阵的重复表头列
合并矩阵重复表头的解决方案
需求说明
需要合并矩阵中连续重复的表头,原始矩阵如下:
12 12 12 13 bb 2 cc 1 aa 5 ee 6
期望处理后的结果:
12 13 bb 2 cc 1 aa 5 ee 6
现有代码问题
尝试的Shell脚本未达到效果,且无法适配更大规模的矩阵:
merged_headers=() for i in {1..3}; do header=$(head -1 unmerge.txt | awk -v col=$i '{print $col}') if [ -z "$header" ]; then header=${merged_headers[-1]} else merged_headers+=($header) fi sed -i "s/^[ \t]*$/$header/g" unmerge.txt done
核心问题:
- 硬编码循环次数
{1..3},无法适配任意列数的矩阵 sed全局替换空行的逻辑错误,会破坏原始数据行的结构- 逐列处理的方式效率极低,大矩阵下性能表现差
高效解决方案:Awk脚本实现
Awk擅长处理结构化文本,可高效适配任意大小的矩阵,以下脚本可完成需求:
BEGIN { OFS="\t" # 用制表符分隔列,保证输出对齐 } NR == 1 { # 处理第一行表头,去重并记录每列对应表头 prev = "" for (i=1; i<=NF; i++) { if ($i != prev) { merged_head[i] = $i prev = $i } else { merged_head[i] = "" } total_cols = i } # 输出合并后的表头 for (i=1; i<=total_cols; i++) { printf "%s%s", merged_head[i], (i == total_cols ? "\n" : OFS) } next } # 原样输出数据行,保持对齐 { for (i=1; i<=total_cols; i++) { printf "%s%s", $i, (i == total_cols ? "\n" : OFS) } }
使用方式
将脚本保存为merge_header.awk,执行命令:
awk -f merge_header.awk unmerge.txt
脚本说明
- 表头处理:遍历第一行所有表头,仅保留连续重复项的第一个,后续重复项置空,实现合并显示效果
- 数据行处理:原样输出每行数据,通过制表符保证和表头对齐
- 兼容性:自动识别矩阵列数,无需硬编码,适配任意规模的矩阵
内容的提问来源于stack exchange,提问作者Dr. Heinz Doofenshmirtz PhD
相关产品推荐
相关产品推荐

