Convertir filas en columnas en el script de shell bash

Convertir filas en columnas en el script de shell bash

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 csvsqldesdecsvkit.

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 utilizar avg()o min()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

información relacionada