我试图根据第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
答案 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
数组不保留随机键的顺序。如果顺序重要,则对结果进行排序。