Testado com o OpenBSD awk
, GNU awk
e mawk
:
awk -F ',| +' '{ for (i = 2; i <= NF; ++i) { print $1, $i } }' data.in |
sort -u |
awk '{ f[$1] = (f[$1] ? f[$1] "," : "") $2 } END { for (k in f) { print k, f[k] } }'
O primeiro awk
expande os dados fornecidos para
Special c1
Special c2
Special c5
Special c7
Special c1
Special c2
Special2 C6
Ele usa tanto vírgulas como vários espaços como delimitador de campo e, para cada registro (linha) de entrada, ele imprime o primeiro campo seguido por cada um dos outros campos, por sua vez, em linhas separadas. Isso pressupõe que não há outros espaços ou vírgulas nas linhas além de onde eles serão interpretados corretamente como delimitadores.
O sort
no meio classifica-o em
Special2 C6
Special c1
Special c2
Special c5
Special c7
Ele faz uma classificação usando a linha completa como a chave de classificação e descarta qualquer linha duplicada.
O último awk
recombina os dados em
Special c1,c2,c5,c7
Special2 C6
Ele faz isso usando o primeiro campo como uma chave em uma matriz associativa e armazena a concatenação separada por vírgula dos dados correspondentes no segundo campo como o valor. No final, todos os dados coletados são impressos.