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

如何用awk将指定表格转换为目标矩阵?

用Awk将表格转换为指定矩阵

输入表格

a   16  moe max us
b   11  tom mic us
d   14  roe fox au
t   29  ann teo au
n   28  joe joe ca

目标矩阵

a_16;   b_11;   d_14;   t_29;   n_28
us; moe_max;    tom_mic;    ;   ;       
au; ;   ;   roe_fox;    ann_teo;    
ca; ;   ;   ;   ;   joe_joe

尝试的Awk命令(未成功)

awk '{a[$5]=a[$5]?a[$5] FS $1"_"$2:$1"_"$2; b[$5]=b[$5]?b[$5] FS $3"_"$4:$3"_"$4;} END{for (i in a){print i"\t" a[i] "\t" b[i];}}' fis.txt

解决方案

要实现目标格式,需先收集所有列标题(如a_16、b_11),再按地区遍历填充对应位置的内容。以下是可行的Awk脚本:

BEGIN {
    FS = " +"  # 适配输入的空格分隔格式
    OFS = ";   "
}

# 第一遍遍历:收集列标题、地区及对应数据
NR == FNR {
    col = $1 "_" $2
    cols[++col_cnt] = col
    data[$5][col] = $3 "_" $4
    regions[$5] = 1
    next
}

# 第二遍遍历:输出结果矩阵
FNR == 1 {
    # 输出标题行
    printf "    "
    for (i=1; i<=col_cnt; i++) {
        printf "%s%s", cols[i], (i==col_cnt ? "\n" : OFS)
    }
    # 输出各地区数据行
    for (reg in regions) {
        printf "%s%s", reg, OFS
        for (i=1; i<=col_cnt; i++) {
            val = (data[reg][cols[i]] != "") ? data[reg][cols[i]] : ";"
            printf "%s%s", val, (i==col_cnt ? "\n" : OFS)
        }
    }
}

使用方式

将脚本保存为convert.awk,执行以下命令:

awk -f convert.awk fis.txt fis.txt

脚本说明

  1. 第一遍遍历:读取输入文件,收集所有列标题,将每个地区对应的$3_$4值存入二维数组data,同时记录所有出现的地区。
  2. 第二遍遍历:先输出标题行,再逐个地区输出数据行,每个标题位置有数据则填充,无数据则输出空占位符;。

内容的提问来源于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 18:46:43