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