Json 仅使用jq和bash将对象转换为数组

Json 仅使用jq和bash将对象转换为数组,json,bash,jq,Json,Bash,Jq,我有一个JSON格式的流,充满了对象。每个对象如下所示: { "object": "alpha", "attributes": [ { "type": "A", "description": "a", "value": 1271129046.9144535 }, { "type": "B", "description": "b", "value": 6738889338.63777 }

我有一个JSON格式的流,充满了对象。每个对象如下所示:

{
  "object": "alpha",
  "attributes": [
    {
      "type": "A",
      "description": "a",
      "value": 1271129046.9144535
    },
    {
      "type": "B",
      "description": "b",
      "value": 6738889338.63777
    },
    {
      "type": "C",
      "description": "c",
      "value": 214918692.38456276
    },
    {
      "type": "D",
      "description": "d",
      "value": 140222346.75136077
    },
    {
      "type": "E",
      "description": "e",
      "value": 2085635554.8128803
    }
  ]
}
我想通过以下方式获取数据:

alpha,A,a,1271129046.9144535
alpha,B,b,6738889338.63777
alpha,C,c,214918692.38456276
alpha,D,d,140222346.75136077
alpha,E,e,2085635554.8128803
下一个对象可能是“beta”而不是“alpha”,因此我不想只去掉“object”键

我的限制是希望在bash管道中处理此流。我希望我可以使用“jq”来实现这一点,而不是通过python/ruby/perl等进行管道传输,如果我能帮上忙的话,我不希望依赖这些


任何想法都将不胜感激

看起来您正在建立CSV数据,
@CSV
过滤器就是为此而设计的。您只需要收集一个要写出的值数组,并将其传递给过滤器。您可以这样做:

$ jq -r '.attributes[] as $attr | [.object, $attr.type, $attr.description, $attr.value] | @csv' input.json
这就产生了:

"alpha","A","a",1271129046.9144535
"alpha","B","b",6738889338.63777
"alpha","C","c",214918692.38456276
"alpha","D","d",140222346.75136077
"alpha","E","e",2085635554.8128803
(1) 比公认的答案略为简短:

jq -r '[.object] + (.attributes[] | [.type, .description, .value]) | @csv'
(2) 如果您不需要引号,那么一种可能性是:

jq -r '"\(.object)," + (.attributes[] | "\(.type),\(.description),\(.value)")'

还有一个我在jq中不知道的特性!这是一个名副其实的实用自助餐!