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 csvsql
decsvkit.
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 usaravg()
oumin()
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