Chinaunix

标题: 请问如何将第一列相同的第二列合到一行,并彼此间用逗号隔开 [打印本页]

作者: chenjiali1    时间: 2019-06-09 17:34
标题: 请问如何将第一列相同的第二列合到一行,并彼此间用逗号隔开
XP_002960178    GO:0055114
XP_002960178    GO:0003824
XP_002960417    GO:0034968
XP_002960417    GO:0018024

想合成这样的
XP_002960178    GO:0055114,GO:0003824
XP_002960417    GO:0034968,GO:0018024

请问如何实现,谢谢大家!

作者: jzsjm1002    时间: 2019-06-09 22:04
  1. awk '{a[$1]=a[$1]?a[$1]=a[$1]","$2:a[$1]=$2} END{for(i in a)print i,a[i]}' file
复制代码

作者: fengzi321    时间: 2019-06-13 17:12
jzsjm1002 发表于 2019-06-09 22:04

怎么理解这条语句 a[$1]=a[$1]?a[$1]=a[$1]","$2:a[$1]=$2

我理解是:如果
a[$1]=a[$1] 为true,则执行a[$1]=a[$1]","$2  否则执行a[$1]=$2

可是 a[$1]=a[$1] 这不是一条赋值语句吗?赋值也有true,false之分?



谢谢!

作者: jzsjm1002    时间: 2019-06-13 22:57
回复 4# fengzi321

awk '' /etc/passwd
awk '0' /etc/passwd
输出都是空 awk 0和空都是无输出的
awk '1' /etc/passwd
awk '123' /etc/passwd
有输出

awk 'a=a' /etc/passwd
a赋值给a 变量a为空
a=a即 空=空 => awk '' /etc/passwd

?: awk三元操作符
if()...else...
if(a[$1]=a[$1])...else...

作者: fengzi321    时间: 2019-06-14 16:47
jzsjm1002 发表于 2019-06-13 22:57
回复 4# fengzi321 awk '' /etc/passwdawk '0' /etc/passwd输出都是空 awk 0和空都是无输出的awk '1' /etc/ ...

豁然开朗,非常感谢!

作者: wh7211    时间: 2019-06-21 15:23
回复 1# chenjiali1


  1. awk '!a[$1]++{if(b){print b;b=""}}{b=b?b","$2:$0}END{if(b){print b}}' file
复制代码





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2