ontherd 发表于 2021-01-25 09:40

awk-多维数值-行列转换

本帖最后由 ontherd 于 2021-01-25 09:42 编辑

问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成(得到如下结果):
姓名 语文 数学 物理
---- ---- ---- ----
李四 74   84   94
张三 74   83   93
-------------------

以上问题使用AWK命令如何实现?求教

jzsjm1002 发表于 2021-01-25 10:29

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

ontherd 发表于 2021-01-25 10:41

回复 2# jzsjm1002

感谢大师回复。一直没有思路~这下思路清晰了。

stupid_lee 发表于 2021-02-20 10:28

回复 3# ontherd

for 循环扫描数组元素,print默认是乱序的,不能保证是按照语文,数学、物理的顺序排列的,可以手动指定编号


stupid_lee 发表于 2021-02-20 10:30

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 "---- ---- ---- ----"}'

reyleon 发表于 2021-02-25 11:29

回复 5# stupid_lee

你这写法显然不科学。

reyleon 发表于 2021-02-25 11:54

# 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
#

ll104567 发表于 2021-03-19 11:15

cat b.txt|awk '{if(a==$1){printf $3" "}else{print x;printf $1" "$3" "}}{a=$1}END{print x}'

just fun
页: [1]
查看完整版本: awk-多维数值-行列转换