Konvertieren Sie Zeilen in Spalten im Bash-Shell-Skript

Konvertieren Sie Zeilen in Spalten im Bash-Shell-Skript

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 csvsqlvon 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 auch avg()oder min()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

verwandte Informationen