我需要編寫一個腳本將以下輸入轉換為所需的輸出。輸入是一個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
每行中的第三列和第四列需要轉換為列。
例如,由於第一行和第二行的第一列和第二列相同,因此 f1 和 f2 的值應該是每行的第三列,f3 應該為 null
答案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()
ormin()
or so(有關示例,請參閱@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