使用jq从列表列表中获取所有值

时间:2019-09-06 10:34:07

标签: json jq

我想获得此topics中的所有json

$ wget https://raw.githubusercontent.com/exercism/c/master/config.json
$ cat config.json | jq merge(.[].topics)

但是显然上面的代码不起作用...

最后,我希望列出所有主题:

arrays
control_flow_loops
...

我对regexp更为熟悉,一种不涉及jq的解决方案可能是:

$ perl -0777 -ne 'print $_ =~ s/[ ",]//gr for 
    m/topics.*?\[\K.*?(?=\])/smg' config.json | sort -u

示例

使用此输入:

{
    "exercises": [
        {
            "topics": [
                "foo"
            ]
        },
        {

            "topics": [
                "bar",
                "baz"
            ]
        },
        {
            "topics": [
                "foo",
                "qux"
            ]
        }
    ]
}

我想要这个输出:

foo
bar
baz
qux

2 个答案:

答案 0 :(得分:2)

怎么样

< config.json jq '.. | objects | .topics[]?'

如果您要删除重复项,则可以将以上内容通过管道传输到sort -u中,或使用jq执行相同的操作,例如使用unique

没有..

在某些情况下,..可能不合适,因此这里提供了一个..的免费解决方案来解决当前的问题:

< config.json jq '[.[][]?.topics[]?] | unique[]'

答案 1 :(得分:0)

因为该问题可以重新定义为“ “如何使用我的JSON实现该操作”” (JSON是数据模型,并且在处理工具上没有垄断性),所以让我向您展示使用Unix walk-path实用程序 jtc 替代方法。

-遍历您可以做的所有topics

bash $ <this.json jtc -w'<topics>l:[:]'
"foo"
"bar"
"baz"
"foo"
"qux"

那里的walk-path-w)并不那么复杂:

  • <topics>l:-将递归地查找标签为topics每个 JSON元素
  • [:]-将在上一步中遍历找到的JSON元素中的所有元素

-要消除重复,可以将其传递给sort -u,也可以通过再次传递给jtc来排序唯一性:

bash $ <this.json jtc -w'<topics>l:[:]' -j | jtc -w'<.>q1:'
"foo"
"bar"
"baz"
"qux"
  • -j将第一个输出包装到 JSON数组中。
  • lexeme <.>q1:将迭代从第二个开始的所有原始 JSON元素(第一个将是数组本身)。

免责声明:
我是jtc工具的创建者,这个答案的目的只是为了展示问题的替代解决方案。我并不想在现有工具上推广使用我的工具。