在jq get数组中基于另一个数组

时间:2018-06-08 09:27:52

标签: arrays json bash iteration jq

我正在使用 jq v1.5 。鉴于输入:

{
    "mine": [
        "foo",
        "baz"
    ],
    "stuff": {
        "foo": {
            "name": "Foo"
        },
        "bar": {
            "name": "Bar"
        },
        "baz": {
            "name": "Baz"
        },
        "qux": {
            "name": "Qux"
        }
    }
}

如何获取 .mine 的所有 .stuff.name

例如,期望的输出:

[
    "Baz",
    "Foo"
]

2 个答案:

答案 0 :(得分:5)

使用简单的jq过滤器而不进行其他shell处理,请按以下步骤操作。

jq '[.mine[] as $in | .stuff[$in].name]'

逻辑基本上是来自.mine的值的索引,并且每个条目在.name

中获得等效的.stuff

jqplay - URL

答案 1 :(得分:-1)

解。我已将文件保存在/ tmp / 1中:

cat /tmp/1 | jq "[ .stuff | $(cat /tmp/1 | jq -r '.mine[]' | sed 's/^/./;s/$/.name/;' | tr '\n' ',' | sed 's/,$//') ]"

首先我得到.mine[]中的名字,即foobaz。然后我将它们转换为.foo.name, .baz.name并传递给jq [ .stuff | $(...) ],结果为[ .stuff | .foo.name, .baz.name ]