如何使用jq将来自不同JSON对象的值合并到一行CSV

时间:2019-06-25 13:35:20

标签: json csv jq

我想使用从JSON文件中提取数据并将其写入CSV文件。

这是我的数据示例:

[
  {
    "media": {
      "track": [
        {
          "attype": "General",
          "FileExtension": "MP4",
          "Format": "MPEG-4"
        },
        {
          "attype": "Video",
          "Format": "MPEG Video"
        }
      ]
    }
  },
  {
    "media": {
      "track": [
        {
          "attype": "General",
          "FileExtension": "ts",
          "Format": "MPEG-TS"
        },
        {
          "attype": "Video",
          "Format": "MPEG Video"
        }
      ]
    }
  }
]

这是所需的输出:

"MP4","MPEG-4","MPEG Video"
"ts","MPEG-TS","MPEG Video"

这是我的代码:

.[].media.track[] |
  [
    (select(.attype =="General") | .FileExtension, .Format),
    (select(.attype =="Video") | .Format)
  ] | @csv

这是实际输出:

"MP4","MPEG-4"
"MPEG Video"
"ts","MPEG-TS"
"MPEG Video"

我已经尝试过使用flatten过滤器和方括号[]的不同用法来构造数组,但是没有用。如何使用达到所需的输出?

2 个答案:

答案 0 :(得分:4)

您处在正确的轨道上(按双关语)–您只需按如下所示扩展.track即可:

.[].media.track
| [.[]
   | (select(.attype =="General") | .FileExtension, .Format),
     (select(.attype =="Video") | .Format) ]
| @csv

或者...

如果您发现所有这些括号和括号过于分散注意力,则可以选择:

.[].media.track
| map( if .attype =="General" then .FileExtension, .Format
       elif .attype =="Video" then .Format
       else empty
       end )
| @csv

答案 1 :(得分:3)

一种解决方案是为每个媒体而不是每个轨道创建一个单元格数组:

.[].media | 
  [ 
    .track[] |
       (select(.attype =="General") | .FileExtension, .Format),
       (select(.attype =="Video") | .Format)
  ] | @csv