首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jq:将数组转换为按文件名索引的对象?

问jq:将数组转换为按文件名索引的对象?
EN

Stack Overflow用户
提问于 2018-07-06 20:11:08
回答 2查看 1.7K关注 0票数 4

如何使用jq将数组转换为按文件名索引的对象,或将多个文件读入一个由文件名索引的对象?

例如:

代码语言:javascript
复制
jq -s 'map(select(.roles[]? | contains ("mysql")))' -C dir/file1.json dir/file2.json

这给了我我想要的数据,但我需要知道它们来自哪个文件。

所以而不是

代码语言:javascript
复制
[
    { "roles": ["mysql"] },
    { "roles": ["mysql", "php"] }
]

为了输出,我想:

代码语言:javascript
复制
{
    "file1": { "roles": ["mysql"] },
    "file2": { "roles": ["mysql", "php"] }
}

如果可能的话,我也希望删除".json“文件扩展名,并且只删除basename (不包括dir)。

示例

file1.json

代码语言:javascript
复制
{ "roles": ["mysql"] }

file2.json

代码语言:javascript
复制
{ "roles": ["mysql", "php"] }

file3.json

代码语言:javascript
复制
{ }

我真正的文件中显然也有其他内容,但对于本例来说,这应该足够了。file3只是为了证明“角色”有时是缺失的。

换句话说:我试图在“角色”列表中找到包含"mysql“的文件。我需要将文件名和内容组合到一个JSON对象中。

为进一步简化问题:

代码语言:javascript
复制
jq 'input_filename' f1 f2

给出我想要的所有文件名,但我不知道如何将它们组合成一个对象或数组。

然而,

代码语言:javascript
复制
jq -s 'map(input_filename)' f1 f2

为每个文件提供一个重复一次的文件名。例如[ "f1", "f1" ]而不是[ "f1", "f2" ]

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-07 03:19:42

如果您的jq有inputs (和JQ1.5一样),那么只需调用一次jq就可以完成任务。而且,使用any可能比迭代.roles的所有元素更有效。

诀窍是使用-n选项调用jq。

代码语言:javascript
复制
jq -n '
  [inputs
   | select(.roles and any(.roles[]; contains("mysql")))
   | {(input_filename | gsub(".*/|\\.json$";"")): .}]
  | add' file*.json
票数 4
EN

Stack Overflow用户

发布于 2018-07-06 20:41:21

jq方法:

代码语言:javascript
复制
jq 'if (.roles[] | contains("mysql")) then {(input_filename | gsub(".*/|\\.json$";"")): .}
    else empty end' ./file1.json ./file2.json | jq -s 'add'

预期产出:

代码语言:javascript
复制
{
  "file1": {
    "roles": [
      "mysql"
    ]
  },
  "file2": {
    "roles": [
      "mysql",
      "php"
    ]
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51217020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档