Converta linhas em colunas no script bash shell

Converta linhas em colunas no script bash shell

Preciso escrever um script para converter a entrada abaixo na saída desejada. A entrada é um arquivo csv

Exemplo de entrada

Id, sid,value,name
20,2,245,f1
20,2,345,f2
20,3,445,f3

Exemplo de saída

Id,sid,f1,f2,f3
20,2,245,345,
20,3,,,445

A terceira e quarta colunas de cada linha precisam ser convertidas em colunas.

Por exemplo, como a primeira e a segunda coluna da primeira e da segunda linha são iguais, os valores de f1 e f2 devem ser a terceira coluna de cada linha e f3 devem ser nulos

Responder1

Você pode usar csvsqldecsvkit.

csvsql -S --query '
    select
    "Id",
    sid,
    max(case when name="f1" then value else null end) as f1,
    max(case when name="f2" then value else null end) as f2,
    max(case when name="f3" then value else null end) as f3
    from file
    group by "Id",sid
'  file
  • Observe que sua coluna é chamada " sid"com espaço à esquerda, portanto precisamos -S(ignorar os espaços iniciais) --- ou usar " sid"na consulta.
  • Observe que eu costumava max()determinar qual valor usar se vários pares de Id/Sid iguais fossem encontrados. Você pode querer usar avg()ou min()ou algo assim (veja o comentário de @FedonKadifeli para ver um exemplo).

Saída:

Id,sid,f1,f2,f3
20,2,245,345,
20,3,,,445

Responder2

Usando Miller (https://github.com/johnkerl/miller)

mlr --csv reshape -s name,value then unsparsify input.csv

voce terá

Id, sid,f1,f2,f3
20,2,245,345,
20,3,,,445

informação relacionada