Ich muss ein Skript schreiben, um die folgende Eingabe in die gewünschte Ausgabe umzuwandeln. Die Eingabe ist eine CSV-Datei
Beispieleingabe
Id, sid,value,name
20,2,245,f1
20,2,345,f2
20,3,445,f3
Beispielausgabe
Id,sid,f1,f2,f3
20,2,245,345,
20,3,,,445
Die dritte und vierte Spalte in jeder Zeile muss in Spalten umgewandelt werden.
Da beispielsweise die erste und zweite Spalte der ersten und zweiten Zeile gleich sind, sollten die Werte von f1 und f2 die 3. Spalte jeder Zeile sein und f3 sollte null sein
Antwort1
Sie können csvsql
von verwendencsvkit.
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
- Beachten Sie, dass Ihre Spalte mit einem führenden Leerzeichen aufgerufen wird
" sid"
. Daher müssen wir-S
(anfängliche Leerzeichen überspringen) --- oder" sid"
in der Abfrage verwenden. - Beachten Sie, dass ich verwendet habe
max()
, um zu bestimmen, welcher Wert verwendet werden soll, wenn mehrere gleiche ID/SID-Paare gefunden werden sollen. Sie können auchavg()
odermin()
oder so verwenden (siehe den Kommentar von @FedonKadifeli für ein Beispiel).
Ausgabe:
Id,sid,f1,f2,f3
20,2,245,345,
20,3,,,445
Antwort2
Mit Miller (https://github.com/johnkerl/miller)
mlr --csv reshape -s name,value then unsparsify input.csv
du wirst haben
Id, sid,f1,f2,f3
20,2,245,345,
20,3,,,445