Combinando texto em linhas contíguas com teclas iguais?

Combinando texto em linhas contíguas com teclas iguais?

Eu tenho um arquivo CSV de entrada parecido com este:

john,Hello my name
john,is John
katie,Whereas my
katie,name is Katie
bob,And I am Bob.

O arquivo é ordenado de forma que os nomes (na primeira coluna) sejam contíguos e o texto (na segunda coluna) seja ordenado logicamente.

Existe uma maneira padronizada de "agrupar por" (usando a terminologia SQL) a primeira coluna e concatenar a segunda coluna?

Minha saída desejada é:

john,Hello my name is John
katie,Whereas my name is Katie
bob,And I am Bob.

Responder1

O conhecimento avançado do comprimento de cada bloco nos poupa da pequena complicação de lidar com uma condição de contorno que de outra forma exigiria um bloco END de funcionalidade replicada.

Não defendo esta abordagem em favor da resposta aceita de Gilles. Apresento-o apenas para demonstrar uma abordagem alternativa que, ao lidar com problemas complicados (este não é um deles), poderia produzir uma redução significativa na complexidade (ao custo de E/S e possivelmente de memória).

aé uma matriz indexada por nome de comprimentos de bloco. né o número de linhas restantes em um bloco:

awk -F, '
    FNR==NR  {a[$1]++; next}
          n  {print " "$2}
         !n  {print; n=a[$1]}
       !--n  {print "\n"}
' ORS= data data

Responder2

Não existe uma ferramenta padrão para isso, não. Esta tarefa é bastante adequada para o awk: leia as linhas uma por uma, salve o primeiro campo e acumule o segundo campo, e imprima o resultado se o primeiro campo mudar. A principal (menor) dificuldade é que o resultado também deve ser impresso quando a última linha for alcançada.

awk -F, '
    1 {current = $1; sub(/^[^,]*,/,"")}
    current == previous {acc = acc " " $0; next}
    NR != 1 {print previous "," acc}
    1 {previous = current; acc = $0}
    END {if (NR) print previous "," acc}'

Responder3

awk -F, '{a[$1]=a[$1]? a[$1]" "$2 : $2;}END{for (i in a)print i, a[i];}' OFS=, filename

informação relacionada