Necesito escribir un script para convertir la siguiente entrada en la salida deseada. La entrada es un archivo csv.
Entrada de muestra
Id, sid,value,name
20,2,245,f1
20,2,345,f2
20,3,445,f3
Salida de muestra
Id,sid,f1,f2,f3
20,2,245,345,
20,3,,,445
La tercera y cuarta columna de cada fila deben convertirse en columnas.
Por ejemplo, dado que la primera y la segunda columna de la primera y la segunda fila son iguales, los valores de f1 y f2 deben ser la tercera columna de cada fila y f3 deben ser nulos.
Respuesta1
Puedes usar csvsql
desdecsvkit.
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
- Tenga en cuenta que su columna se llama
" sid"
con un espacio inicial, por lo que necesitamos-S
(omitir los espacios iniciales) --- o usarlo" sid"
en la consulta. - Tenga en cuenta que solía
max()
determinar qué valor usar si se debían encontrar varios pares de Id/sid iguales. Es posible que desee utilizaravg()
omin()
algo así (consulte el comentario de @FedonKadifeli para ver un ejemplo).
Producción:
Id,sid,f1,f2,f3
20,2,245,345,
20,3,,,445
Respuesta2
Usando Molinero (https://github.com/johnkerl/miller)
mlr --csv reshape -s name,value then unsparsify input.csv
usted tendrá
Id, sid,f1,f2,f3
20,2,245,345,
20,3,,,445