Eu tenho um arquivo como abaixo ..
abc, 12345
def, text and nos
ghi, something else
jkl, words and numbers
abc, 56345
def, text and nos
ghi, something else
jkl, words and numbers
abc, 15475
def, text and nos
ghi, something else
jkl, words and numbers
abc, 123345
def, text and nos
ghi, something else
jkl, words and numbers
Eu quero convertê-lo como:
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
text-processing
command-line
awk
join
merge
pvkbhat
fonte
fonte
Respostas:
Se você não se importa com a ordem de saída:
Explicação
NF>1
ou seja, precisamos processar apenas a linha que não está em branco.a
, com a chave é o primeiro campo, o valor é o segundo campo (ou o restante da linha). Se a chave já possui valor, concatizamos dois valores.END
bloco, percorremos o array associativoa
, imprimimos todas as suas chaves com o valor correspondente.Ou usar
perl
manterá a ordem:fonte
perl -F, -lane 'next unless /./;push @{$k{$F[0]}}, ",@F[1..$#F]"; END{print "$_@{$k{$_}}" foreach keys(%k)}' file
:) Grandes mentes pensam da mesma forma!Oh, isso é fácil. Aqui está uma versão simples que mantém a ordem das chaves conforme elas aparecem no arquivo:
A saída deve ficar assim:
Se você não se importa em ter uma linha em branco extra no final, substitua a
printf
linha porprintf("%s %s\n\n", Key[j], Val[Key[j]]);
fonte