加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

multidimensional-array – AWK中的数据透视表

发布时间:2020-12-14 00:06:05 所属栏目:Linux 来源:网络整理
导读:我需要将元素从数组转换为列索引,并为每个列索引返回$3的值. 我无法访问gawk 4,因此无法使用真正的多维数组. 输入 Name^Code^CountName1^0029^1 Name1^0038^1 Name1^0053^1 Name2^0013^3 Name2^0018^3 Name2^0023^5 Name2^0025^1 Name2^0029^1 Name2^0038^1
我需要将元素从数组转换为列索引,并为每个列索引返回$3的值.
我无法访问gawk 4,因此无法使用真正的多维数组.

输入

Name^Code^Count
Name1^0029^1  
Name1^0038^1   
Name1^0053^1  
Name2^0013^3  
Name2^0018^3  
Name2^0023^5  
Name2^0025^1  
Name2^0029^1  
Name2^0038^1  
Name2^0053^1  
Name3^0018^1  
Name3^0060^1  
Name4^0018^2  
Name4^0025^5  
Name5^0018^2  
Name5^0025^1  
Name5^0060^1

期望的输出

Name^0013^0018^0023^0025^0029^0038^0053^0060
Name1^^^^^1^1^1^  
Name2^3^3^5^1^1^1^1^  
Name3^^1^^^^^^1  
Name4^^2^^5^^^^  
Name5^^^^1^^^^1

有关如何在不使用真正的多维数组的情况下解决此任务的任何建议?

解决方法

以下解决方案使用GNU awk v3.2功能进行排序.这不使用多维数组.它只模拟一个.

awk -F"^" '
NR>1{
    map[$1,$2] = $3
    name[$1]++
    value[$2]++
}
END{
    printf "Name"
    n = asorti(value,v_s)
    for(i=1; i<=n; i++) {
        printf "%s%s",FS,v_s[i]
    }
    print ""
    m = asorti(name,n_s)
    for(i=1; i<=m; i++) { 
        printf "%s",n_s[i]
        for(j=1; j<=n; j++) { 
            printf "%s%s",map[n_s[i],v_s[j]]
        }
        print ""
    }
}' file
Name^0013^0018^0023^0025^0029^0038^0053^0060
Name1^^^^^1^1^1^
Name2^3^3^5^1^1^1^1^
Name3^^1^^^^^^1
Name4^^2^^5^^^^
Name5^^2^^1^^^^1

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读