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番目の列を列に変換する必要があります。

たとえば、最初の行と2番目の行の最初の列と2番目の列が同じであるため、f1とf2の値は各行の3番目の列でなければならず、f3は空でなければなりません。

答え1

使用csvsqlできるcsvkit

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

関連情報