根据另一列合并多行中的一列

时间:2017-10-16 14:32:36

标签: awk

尝试根据第一列将多行合并为1。

实施例。 File1

S784    CHST5,TMEM231  
S784    TM4SF20  
S784    TMEM184A  
U531    5S_rRNA,C3orf33  
U604    LRRC69  
U586    PLEKHA5,C8orf77  
U586    ZNF252,LINGO2 

输出文件

S784    CHST5,TMEM231,TM4SF20,TMEM184A  
U531    5S_rRNA,C3orf33  
U604    LRRC69  
U586    PLEKHA5,C8orf77,ZNF252,LINGO2  

这是我到目前为止所做的,但它有效,但给我一个额外的逗号,我似乎无法弄清楚如何摆脱......

awk -F'\t' '{a[$1]++; list[$1]=list[$1]","$2} END {for (i in a) print i,FS,list[i]}' File1 > output  

当前输出

S784    ,CHST5,TMEM231,TM4SF20,TMEM184A  
U531    ,5S_rRNA,C3orf33  
U604    ,LRRC69  
U586    ,PLEKHA5,C8orf77,ZNF252,LINGO2

我也尝试过使用list[$1]=$2","list[$1],但这仍然只是在末尾而不是第2列的开头给我一个额外的逗号。

1 个答案:

答案 0 :(得分:0)

Awk 解决方案:

awk -F'\t' '{ a[$1]=($1 in a? a[$1]",":"")$2 }END{ for(i in a) print i,a[i] }' OFS='\t' file
  • a[$1] - 数组a使用第一个字段值$1

  • 编制索引
  • ($1 in a? a[$1]",":"")$2 - 在遍历记录时检查当前密钥$1是否已在数组a中(由三元条件{{执行] 1}}),如果是的话 - 使用$1 in a?作为分隔符,将前一个值a[$1]与当前值$2连接起来;否则 - 只需使用当前值,

  • 进行分配

输出:

$2