我试图根据第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发布于 2020-06-30 11:07:32
$ 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数组不会保留随机键的顺序。如果顺序很重要,则对结果进行排序。
https://stackoverflow.com/questions/62649461
复制相似问题