模式匹配字段名称与 jq
Pattern matching field names with jq
这是一个非常基本(可能很愚蠢)的问题,但我无法解决...
我有一个具有这种结构的 JSON 文件:
{
"data": {
"what a burger": [1,2,3],
"wap": [66],
"the map": [11,20],
"H. Incandenza": [1,1],
"What a burger": [a,a,3]
}
}
我想提取 data 中 "name" 匹配特定模式的字段值。例如,我想提取 "what a burger" 所有不区分大小写的巧合以获得
[1,2,3],[a,a,3]
我猜是这样的
jq '.data | match("what a burger";"i")'
但这会导致
jq: error (at <stdin>:9): object ({"what a bu...) cannot be matched, as it is not a string
干杯。
您的语句不起作用,因为您尝试将数据对象提供给 match,但 match 只能对字符串起作用。
以下表达式将执行您想要的操作。 to_entries
将对象转换为键和值数组。然后,我们通过使用 map
和 select
遍历此数组的所有条目,其中 .key
(现在是一个字符串)具有 match
。最后我们只打印出每个元素的值。
.data | to_entries | map(select(.key | match("what a burger";"i"))) | map(.value)
不过,两点意见:
- JSON 中不允许
[a,a,3]
,因为 a
不是数字。
- 之所以有效,是因为键实际上是不同的,即使只是字母大小写不相等。如果至少有两个键相同,您将 运行 出问题,因为键应该是唯一的。事实上,
jq
只会输出其中一个元素。
这里有一个稍微简短的替代方法:
.data | with_entries(select(.key|match("what a burger";"i")))[]
纠正输入后,使用 jq 的 -c 选项,这将产生两行:
[1,2,3]
["a","a",3]
这是一个非常基本(可能很愚蠢)的问题,但我无法解决...
我有一个具有这种结构的 JSON 文件:
{
"data": {
"what a burger": [1,2,3],
"wap": [66],
"the map": [11,20],
"H. Incandenza": [1,1],
"What a burger": [a,a,3]
}
}
我想提取 data 中 "name" 匹配特定模式的字段值。例如,我想提取 "what a burger" 所有不区分大小写的巧合以获得
[1,2,3],[a,a,3]
我猜是这样的
jq '.data | match("what a burger";"i")'
但这会导致
jq: error (at <stdin>:9): object ({"what a bu...) cannot be matched, as it is not a string
干杯。
您的语句不起作用,因为您尝试将数据对象提供给 match,但 match 只能对字符串起作用。
以下表达式将执行您想要的操作。 to_entries
将对象转换为键和值数组。然后,我们通过使用 map
和 select
遍历此数组的所有条目,其中 .key
(现在是一个字符串)具有 match
。最后我们只打印出每个元素的值。
.data | to_entries | map(select(.key | match("what a burger";"i"))) | map(.value)
不过,两点意见:
- JSON 中不允许
[a,a,3]
,因为a
不是数字。 - 之所以有效,是因为键实际上是不同的,即使只是字母大小写不相等。如果至少有两个键相同,您将 运行 出问题,因为键应该是唯一的。事实上,
jq
只会输出其中一个元素。
这里有一个稍微简短的替代方法:
.data | with_entries(select(.key|match("what a burger";"i")))[]
纠正输入后,使用 jq 的 -c 选项,这将产生两行:
[1,2,3]
["a","a",3]