的默认功能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 中[ ... ]
(并展开.list
with .list[]
)以生成然后加入的单个数组,那么您的方法将会起作用。这就是我在上面的第一种方法中所做的;只是我使用稍短的表达式来生成该数组的元素。
$ jq -r '[ to_entries[] | { list: .value.list1 } | .list[] ] | join(" ")' file
val1 val2 val3 val4 val5 val6