如何使用jq将数组转换为按文件名索引的对象,或将多个文件读入一个由文件名索引的对象?
例如:
jq -s 'map(select(.roles[]? | contains ("mysql")))' -C dir/file1.json dir/file2.json这给了我我想要的数据,但我需要知道它们来自哪个文件。
所以而不是
[
{ "roles": ["mysql"] },
{ "roles": ["mysql", "php"] }
]为了输出,我想:
{
"file1": { "roles": ["mysql"] },
"file2": { "roles": ["mysql", "php"] }
}如果可能的话,我也希望删除".json“文件扩展名,并且只删除basename (不包括dir)。
示例
file1.json
{ "roles": ["mysql"] }file2.json
{ "roles": ["mysql", "php"] }file3.json
{ }我真正的文件中显然也有其他内容,但对于本例来说,这应该足够了。file3只是为了证明“角色”有时是缺失的。
换句话说:我试图在“角色”列表中找到包含"mysql“的文件。我需要将文件名和内容组合到一个JSON对象中。
为进一步简化问题:
jq 'input_filename' f1 f2给出我想要的所有文件名,但我不知道如何将它们组合成一个对象或数组。
然而,
jq -s 'map(input_filename)' f1 f2为每个文件提供一个重复一次的文件名。例如[ "f1", "f1" ]而不是[ "f1", "f2" ]
发布于 2018-07-07 03:19:42
如果您的jq有inputs (和JQ1.5一样),那么只需调用一次jq就可以完成任务。而且,使用any可能比迭代.roles的所有元素更有效。
诀窍是使用-n选项调用jq。
jq -n '
[inputs
| select(.roles and any(.roles[]; contains("mysql")))
| {(input_filename | gsub(".*/|\\.json$";"")): .}]
| add' file*.json发布于 2018-07-06 20:41:21
jq方法:
jq 'if (.roles[] | contains("mysql")) then {(input_filename | gsub(".*/|\\.json$";"")): .}
else empty end' ./file1.json ./file2.json | jq -s 'add'预期产出:
{
"file1": {
"roles": [
"mysql"
]
},
"file2": {
"roles": [
"mysql",
"php"
]
}
}https://stackoverflow.com/questions/51217020
复制相似问题