awk-多维数值-行列转换
本帖最后由 ontherd 于 2021-01-25 09:42 编辑问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成(得到如下结果):
姓名 语文 数学 物理
---- ---- ---- ----
李四 74 84 94
张三 74 83 93
-------------------
以上问题使用AWK命令如何实现?求教
awk 'BEGIN{print "姓名 语文 数学 物理\n---- ---- ---- ----"}NR>1{name[$1][$2]=$3}END{for(x in name){printf x" ";for(y in name){ printf name" ";};print""};print "-------------------"}' file 回复 2# jzsjm1002
感谢大师回复。一直没有思路~这下思路清晰了。 回复 3# ontherd
for 循环扫描数组元素,print默认是乱序的,不能保证是按照语文,数学、物理的顺序排列的,可以手动指定编号
awk 'BEGIN{print "姓名 语文 数学 物理\n---- ---- ---- ---- "}/语文/{a[$1,1]=$3}/数学/{a[$1,2]=$3}/物理/{a[$1,3]=$3}{b[$1]=1}END{for(i in b)print i,a,a,a;print "---- ---- ---- ----"}' 回复 5# stupid_lee
你这写法显然不科学。 # cat file
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
王五 化学 88
朱六 生物 97
张三 生物 89
李四 化学 77
王五 数学 60
#
#
#
# cat px.awk
#!/bin/awk -f
NR==1{t=$1;next}
{
if(!a[$1]++)b[++n]=$1;
if(!h[$2]++)i[++m]=$2;
R[$1,$2]=$3
}
END {
for(c=1;c<=m;c++)t=t"\t"i;
print t;
for(c=1;c<=n;c++) {
xm=b
for(d=1;d<=m;d++) {
xm=xm"\t"(R,i]?R,i]:"-")
}
print xm
}
}
#
# ./px.awk file
姓名 语文 数学 物理 化学 生物
张三 74 83 93 - 89
李四 74 84 94 77 -
王五 - 60 - 88 -
朱六 - - - - 97
# cat b.txt|awk '{if(a==$1){printf $3" "}else{print x;printf $1" "$3" "}}{a=$1}END{print x}'
just fun
页:
[1]