如何创建数据透视表

时间:2014-03-20 23:36:21

标签: bash awk

我有一个这样的数据文件:

id1    name1 cat1  catname1
id1    name1 cat2  catname2
id2    name2 cat3  catname3
id3    name3 cat1  catname1
id3    name3 cat4  catname4

我想生成以下内容:

id1    name1 cat1:catname1, cat2:catname2
id2    name2 cat3:catname3
id3    name3 cat1:catname1, cat4:catname4

有没有办法用AWK做到这一点?

2 个答案:

答案 0 :(得分:2)

试试这个:

$ awk '
(($1 FS $2) in a) { 
    a[$1 FS $2] = a[$1 FS $2] ", " $(NF-1) ":" $NF
    next 
}
{ a[$1 FS $2] = $(NF-1) ":" $NF }
END { 
    for(x in a) 
        print x, a[x] 
}' file
id2 name2 cat3:catname3
id1 name1 cat1:catname1, cat2:catname2
id3 name3 cat1:catname1, cat4:catname4

如果订单很重要,您可以尝试使用gnu-awk备用:

$ gawk '
(($1 FS $2) in a) { 
    a[$1 FS $2] = a[$1 FS $2] ", " $(NF-1) ":" $NF
    next 
}
{ a[$1 FS $2] = $(NF-1) ":" $NF }
END { 
    n = asorti(a,s)
    for(x=1; x<=n; x++) 
        print s[x], a[s[x]] 
}' file
id1 name1 cat1:catname1, cat2:catname2
id2 name2 cat3:catname3
id3 name3 cat1:catname1, cat4:catname4

答案 1 :(得分:1)

这是使用awk

执行此操作的非常标准的方法
awk '{a[$1FS$2]=a[$1FS$2]?a[$1FS$2]$3FS$4:$3FS$4} END {for (i in a) print i,a[i]}' file
id2 name2 cat3 catname3
id1 name1 cat1 catname1cat2 catname2
id3 name3 cat1 catname1cat4 catname4