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

Converting object into array using only jq and bash

我有一个 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)")'