Você pode usar um array associativo awk indexado pelo campo cuja exclusividade você está afirmando, para os valores exclusivos do campo to= (campo $6 quando dividido por vírgulas):
$ awk -F, '{split($6,s,"="); arr[s[2]]=s[2]" = "$7","$6;} END{for (id in arr) print arr[id]}' data.txt
EGF = toid=164,to=EGF
ADRA1A = toid=21,to=ADRA1A
ACE = toid=11,to=ACE
ADRA1B = toid=22,to=ADRA1B
ADRA1D = toid=23,to=ADRA1D
DRD2 = toid=158,to=DRD2
CHRM1 = toid=114,to=CHRM1
CHRM2 = toid=115,to=CHRM2
A expressão para as entradas exclusivas fromid é a mesma, mas substitui os campos $6 e $7 por $2 e $3 :
$ awk -F, '{split($2,s,"="); arr[s[2]]=s[2]" = "$3","$2;} END{for (id in arr) print arr[id]}' data.txt
ABCC8 = fromid=5,from=ABCC8
ABCB11 = fromid=4,from=ABCB11
Se você quiser que a saída contenha os dados toid e fromid , poderá combinar as expressões, por exemplo,
awk -F, '{
split($2,s,"="); arr[s[2]]=s[2]" = "$3","$2;
split($6,s,"="); arr[s[2]]=s[2]" = "$7","$6;
} END{for (id in arr) print arr[id]}' data.txt
Para alterar os rótulos (isto é, rotular todos os campos em uma tabela como toid mesmo se eles forem provenientes de fromid linhas) provavelmente o caminho mais natural é canalizar a saída por meio de sed , por exemplo.
$ awk -F, '{
split($2,s,"="); arr[s[2]]=s[2]" = "$3","$2;
split($6,s,"="); arr[s[2]]=s[2]" = "$7","$6;
} END{for (id in arr) print arr[id]}' data.txt | sed 's/from/to/g'
ABCC8 = toid=5,to=ABCC8
EGF = toid=164,to=EGF
ADRA1A = toid=21,to=ADRA1A
ACE = toid=11,to=ACE
ABCB11 = toid=4,to=ABCB11
ADRA1B = toid=22,to=ADRA1B
ADRA1D = toid=23,to=ADRA1D
DRD2 = toid=158,to=DRD2
CHRM1 = toid=114,to=CHRM1
CHRM2 = toid=115,to=CHRM2
Você pode fazer as substituições de fromid <--> toid dentro de awk , mas esse método torna a intenção mais clara, eu acho. A outra tabela pode ser feita apenas alterando a expressão sed final para sed 's/to/from/g' .