我需要编写一个脚本将以下输入转换为所需的输出。输入是一个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 应该为空
答案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