Se você não se importa com a ordem de saída:
$ awk -F',' 'NF>1{a[$1] = a[$1]","$2};END{for(i in a)print i""a[i]}' file
jkl, words and numbers, words and numbers, words and numbers, words and numbers
abc, 12345, 56345, 15475, 123345
ghi, something else, something else, something else, something else
def, text and nos, text and nos, text and nos, text and nos
Explicação
-
NF>1
significa que precisamos apenas processar a linha que não está em branco. - Salvamos todo o primeiro campo na matriz associativa
a
, com a chave sendo o primeiro campo, o valor é o segundo campo (ou o restante da linha). Se a chave já tiver valor, nós concatimos dois valores. - No bloco
END
, percorremos a matriz associativaa
e imprimimos todas as suas chaves com o valor correspondente.
Ou usar perl
manterá o pedido:
$perl -F',' -anle 'next if /^$/;$h{$F[0]} = $h{$F[0]}.", ".$F[1];
END{print $_,$h{$_},"\n" for sort keys %h}' file
abc, 12345, 56345, 15475, 123345
def, text and nos, text and nos, text and nos, text and nos
ghi, something else, something else, something else, something else
jkl, words and numbers, words and numbers, words and numbers, words and numbers