如何用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
脚本说明
- 第一遍遍历:读取输入文件,收集所有列标题,将每个地区对应的
$3_$4值存入二维数组data,同时记录所有出现的地区。 - 第二遍遍历:先输出标题行,再逐个地区输出数据行,每个标题位置有数据则填充,无数据则输出空占位符
;。
内容的提问来源于stack exchange,提问作者Dr. Heinz Doofenshmirtz PhD
相关产品推荐
相关产品推荐

