在 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 應該為 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()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

相關內容