jq:一次打印多个数组中的多个值

jq:一次打印多个数组中的多个值

的默认功能jq是一次发送一个数组中的每个对象,尽管join操作符可以合并这些值。我的问题是尝试一次打印多个数组中的所有值。以这个例子为例:

{
    "key1": {
        "list1": [
            "val1",
            "val2",
            "val3"
        ]
    },
    "key2": {
        "list1": [
            "val4",
            "val5"
        ]
    },
    "key3": {
        "list1": [
            "val6"
        ]
    }
}

我想打印:

val1 val2 val3 val4 val5 val6

到目前为止:

jq -r 'to_entries[] | { list: .value.list1 } | .list | join(" ")' test.json

(对于帮助审稿人来说,过于冗长。)

这使:

val1 val2 val3
val4 val5
val6

有没有一种方法可以在一个命令中将所有值收集在一起?

答案1

$ jq -r '[ .[].list1[] ] | join(" ")' file
val1 val2 val3 val4 val5 val6

list1使用每个顶级键中每个数组的所有元素创建一个新数组。然后,用空格连接其元素。这将按照它们在输入文件中出现的顺序为您提供值。

另一种(可以说是更简洁的)方法是map(.list1)返回一个数组数组,您可以将其展平并连接起来:

$ jq -r 'map(.list1) | flatten | join(" ")' file
val1 val2 val3 val4 val5 val6

.list由于依次是数组之一,您的尝试会为每个顶级键生成一个连接字符串list1。如果您将直到最后一个管道符号的所有内容都封装在 a 中[ ... ](并展开.listwith .list[])以生成然后加入的单个数组,那么您的方法将会起作用。这就是我在上面的第一种方法中所做的;只是我使用稍短的表达式来生成该数组的元素。

$ jq -r '[ to_entries[] |  { list: .value.list1 } | .list[] ] | join(" ")' file
val1 val2 val3 val4 val5 val6

相关内容