You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

脚本说明

  1. 表头处理:遍历第一行所有表头,仅保留连续重复项的第一个,后续重复项置空,实现合并显示效果
  2. 数据行处理:原样输出每行数据,通过制表符保证和表头对齐
  3. 兼容性:自动识别矩阵列数,无需硬编码,适配任意规模的矩阵

内容的提问来源于stack exchange,提问作者Dr. Heinz Doofenshmirtz PhD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 03:01:02