bash シェル スクリプトで行を列に変換する

bash シェル スクリプトで行を列に変換する

以下の入力を希望の出力に変換するスクリプトを書く必要があります。入力はcsvファイルです。

サンプル入力

Id, sid,value,name
20,2,245,f1
20,2,345,f2
20,3,445,f3

サンプル出力

Id,sid,f1,f2,f3
20,2,245,345,
20,3,,,445

各行の 3 列目と 4 列目を列に変換する必要があります。

たとえば、1行目と2行目の1列目と2列目は同じなので、f1とf2の値は各行の3列目になり、f3はnullになります。

答え1

csvsqlからご利用いただけますcsvキット

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
  • 列は" sid"先頭にスペースを付けて呼び出されるため、クエリでは-S(最初のスペースをスキップ) --- または を使用する必要があることに注意してください" sid"
  • max()同じ Id/sid ペアが複数見つかった場合にどの値を使用するかを決定するために使用したことに注目してください。avg()またはmin()などを使用するとよいでしょう (例については @FedonKadifeli のコメントを参照してください)。

出力:

Id,sid,f1,f2,f3
20,2,245,345,
20,3,,,445

答え2

ミラーの使用(https://github.com/johnkerl/miller

mlr --csv reshape -s name,value then unsparsify input.csv

あなたは

Id, sid,f1,f2,f3
20,2,245,345,
20,3,,,445

関連情報