根据不同级别的条件选择“ jq”

时间:2019-08-26 02:07:05

标签: jq

我想在一个长的json文件中选择以下节点。

条件为"locator": "mmc1""#name": "section-title"。这种嵌套结构使jq查询非常复杂。请注意,我必须多次指定“ locator”和“ section-title”之类的内容。

.. | .["$$"]?
 | select((.[]? | ."#name" == "section-title"?) and (..[]? | .locator? | test("mmc[0-9]+")?))
 | [
(..[]? | select(.locator? | test("mmc[0-9]+")?) | .locator)
, (.[] | select(."#name" == "section-title") | ._)
] | @tsv

有人可以让我知道如何在jq中简化查询,但要确保其功能与原始查询完全相同吗?仅使以下简化的测试输入产生相同的输出不应视为等效查询。谢谢。

...
              "$$": [
                {
                  "#name": "label",
                  "_": "Appendix A"
                },
                {
                  "#name": "section-title",
                  "$": {
                    "id": "sectitle0145"
                  },
                  "_": "Supplementary data"
                },
                {
                  "#name": "para",
                  "$": {
                    "id": "p0210",
                    "view": "all"
                  },
                  "$$": [
                    {
                      "#name": "__text__",
                      "_": "The following is the supplementary data related to this article:"
                    },
                    {
                      "#name": "display",
                      "$$": [
                        {
                          "#name": "e-component",
                          "$": {
                            "id": "ec1"
                          },
                          "$$": [
                            {
                              "#name": "link",
                              "$": {
                                "locator": "mmc1",
                                "type": "simple",
                                "role": "http://data.elsevier.com/vocabulary/ElsevierContentTypes/46.1",
                                "href": "pii:S2212877817302818/mmc1",
                                "id": "aep-link-id8"
                              }
                            }
                          ]
                        }
                      ]
                    }
                  ]
                }
              ]
...

请参见下面的输出。

$ jq '.. | .["$$"]? | select((.[]? | ."#name" == "section-title"?) and (..[]? | .locator? | test("mmc[0-9]+")?)) | [ (..[]? | select(.locator? | test("mmc[0-9]+")?) | .locator) , (.[] | select(."#name" == "section-title") | ._) ] | @tsv' < 1.json
"mmc1\tSupplementary data"
$ cat 1.json
            {
              "$$": [
                {
                  "#name": "label",
                  "_": "Appendix A"
                },
                {
                  "#name": "section-title",
                  "$": {
                    "id": "sectitle0145"
                  },
                  "_": "Supplementary data"
                },
                {
                  "#name": "para",
                  "$": {
                    "id": "p0210",
                    "view": "all"
                  },
                  "$$": [
                    {
                      "#name": "__text__",
                      "_": "The following is the supplementary data related to this article:"
                    },
                    {
                      "#name": "display",
                      "$$": [
                        {
                          "#name": "e-component",
                          "$": {
                            "id": "ec1"
                          },
                          "$$": [
                            {
                              "#name": "link",
                              "$": {
                                "locator": "mmc1",
                                "type": "simple",
                                "role": "http://data.elsevier.com/vocabulary/ElsevierContentTypes/46.1",
                                "href": "pii:S2212877817302818/mmc1",
                                "id": "aep-link-id8"
                              }
                            }
                          ]
                        }
                      ]
                    }
                  ]
                }
              ]
            }

2 个答案:

答案 0 :(得分:-1)

如果要无条件获取所有对象的"locator"值,则可以使用以下方法:

..|objects.locator|strings

要查找带有#name == "section-title"的所有对象并选择_值:

..|select(objects."#name" == "section-title")._

将它们放在一起:

[(..|objects.locator|strings), (..|select(objects."#name" == "section-title")._)] | @tsv

https://jqplay.org/s/xHWg8aGSSS

答案 1 :(得分:-1)

以下至少在某些方面更简单,可以产生所需的结果,并且似乎可以反映要求:

}