以下の入力を希望の出力に変換するスクリプトを書く必要があります。入力は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