Uma abordagem Perl (assumindo que a ordem não é importante):
$ perl -lne 'while(/(\w+):(\d+)/g){
push @{$k{$1}},$2
}
END{
print "$_: " . join ",", @{$k{$_}} for keys %k
}' file
ABCDEFG_10_node10: 2154,54,2254,64,410,10,210,10,365,890,741
Isso lê o arquivo de entrada linha a linha ( -ln
) e executa o script fornecido por -e
nele. O while(/(\w+):(\d+)/g)
coletará todas as instâncias de espaços não brancos, seguidas por :
e, em seguida, mais espaços não brancos. Como eles estão sendo capturados entre parênteses, o $1
será o nome e o $2
o valor. Estes são então colocados em um hash de arrays (hash %k
, cujos valores são arrays). Finalmente, imprimimos cada chave do hash (os nomes) junto com o array de seus valores, unidos por ,
.
Se você valoriza a concisão, você pode escrever o acima como um verso:
perl -lne 'while(/(\S+):(\S+)/g){push @{$k{$1}},$2}}{$"=",";print"$_: @{$k{$_}}" for keys%k' file
legibilidade passada:
perl -nE'push@{$k{$1}},$2while/(\w+):(\d+)/g}{$"=",";say"$_: @{$k{$_}}"for keys%k' file