在 bash shell 脚本中将行转换为列

在 bash shell 脚本中将行转换为列

我需要编写一个脚本将以下输入转换为所需的输出。输入是一个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()or min()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

相关内容