根据列对行进行分组

时间:2020-06-30 02:37:26

标签: awk

我试图根据第1列在下面将结果分组,但无法做到这一点。

输入:

rs10923724 C TBX15 intergenic
rs10923724 T WARS2 intron
rs72705210 G AMPD2 upstream
rs72705210 A GSTM4 downstream

所需的输出:

rs10923724 C,T TBX15,WARS2 intergenic,intron
rs72705210 G,A AMPD2,GSTM4 upstream,downstream

我尝试过的代码:

awk '{ A[$1]=A[$1]", "$2} END { for(X in A) print X"\t",substr(A[X],=2) }'

输出:

rs10923724 C,T
rs72705210 G,A

1 个答案:

答案 0 :(得分:1)

$ awk '{k=$1; 
        for(i=2;i<=NF;i++) a[k,i]=(k in ks)?a[k,i]","$i:$i;
        ks[k]} 
   END {for(k in ks) 
          {printf "%s", k FS; 
           for(i=2;i<=NF;i++) printf "%s", a[k,i] (i==NF?ORS:FS)}}' file

rs72705210 G,A AMPD2,GSTM4 upstream,downstream
rs10923724 C,T TBX15,WARS2 intergenic,intron

通过键和列索引对每列进行分组,因为分隔符仅在元素之间添加第一个值有特殊处理。分别跟踪键,以便以后检索。最后,为每个键打印汇总的列;根据列索引在字段和记录之间添加正确的分隔符。

awk数组不保留随机键的顺序。如果顺序重要,则对结果进行排序。