代码之家  ›  专栏  ›  技术社区  ›  igbins09

在shell bash脚本中使用jq将单行JSON转换为csv

  •  0
  • igbins09  · 技术社区  · 2 年前
    {
      "name": "john",
      "age": "22",
      "state": "Texas",
      "city": "Dallas",
      "dailysteps": 99,
      "weeklysteps": 2377,
      "monthlysteps": 330003
    }
    

    例如,我有这行json数据(我们称之为data.json),我需要用以下输出格式将其转换为csv(pls,附带图片中的输出示例)。我只对挑选dailysteps、weeklysteps和monthlysteps感兴趣,并添加一个“总步骤”列,如所附图片中所示

    它应该有这样的自定义标题标题

    Daily Steps, Weekly Steps, Monthly Steps, Total Steps
    99 , 2377 , 330003 , 332479
    

    example

    1 回复  |  直到 2 年前
        1
  •  3
  •   pmf    2 年前

    这样行吗?

    jq -r '
      ["Daily Steps", "Weekly Steps", "Monthly Steps", "Total Steps"], 
      ([.dailysteps, .weeklysteps, .monthlysteps] | . + [add])
      | @csv
    ' data.json
    
    "Daily Steps","Weekly Steps","Monthly Steps","Total Steps"
    99,2377,330003,332479
    

    Demo


    在本地时区中添加包含当前小时的另一列(如 comment ),使用 now - 3600 | localtime[3] 将是一种选择:

    jq -r '
      ["Hours", "Daily Steps", "Weekly Steps", "Monthly Steps", "Total Steps"],
      ([.dailysteps, .weeklysteps, .monthlysteps] | [now - 3600 | localtime[3]] + . + [add])
      | @csv
    '
    
    "Hours","Daily Steps","Weekly Steps","Monthly Steps","Total Steps"
    22,99,2377,330003,332479
    

    Demo

    jq ,使用 --argjson 选项:

    jq -r --argjson H "$(date +%H -d "1 hour ago")" '
      ["Hours", "Daily Steps", "Weekly Steps", "Monthly Steps", "Total Steps"],
      ([.dailysteps, .weeklysteps, .monthlysteps] | [$H] + . + [add])
      | @csv
    '
    
    22,99,2377,330003,332479