与 JQ 的价值映射
Value map with JQ
我有一个很大的 JSON 文件,我想在其中根据某种映射转换一些值。
我的数据是这样的:
[
{"id":1, "value":"yes"},
{"id":2, "value":"no"},
{"id":3, "value":"maybe"}
]
我想将其转换成这样的列表:
[
{"id":1, "value":"10"},
{"id":2, "value":"0"},
{"id":3, "value":"5"}
]
固定映射:
yes => 10
no => 0
maybe => 5
我目前的解决方案是基于这样一个简单的 if-elif-else
组合:
cat data.json| jq '.data[] | .value = (if .value == "yes" then "10" elif .value == "maybe" then "5" else "0" end)'
但这真的很难看,我希望有一种更直接的方式来表达映射。
感谢您的帮助
由于您正在翻译字符串值,因此您应该能够使用 json 对象来保存映射。那么映射将是微不足道的。
$ jq --arg mapping '{"yes":"10","no":"0","maybe":"5"}'
'map(.value |= ($mapping | fromjson)[.])' data.json
如果想避免在命令行上指定映射,那么以下两个变体可能会引起您的兴趣。
第一个变体可以与 jq 1.3、jq 1.4 和 jq 1.5 一起使用:
def mapping: {"yes":"10","no":"0","maybe":"5"};
map(.value |= mapping[.])
下一个变体使用 --argfile 选项(自 jq 1.4 起可用),如果映射对象在文件中可用,则很有趣:
jq --argfile mapping mapping.jq 'map(.value |= $mapping[.])' data.json
最后,在 jq 1.5 中,其他基于 import 的替代方案也可用 (!)。
这是一个使用 "inline" 对象的解决方案,因为映射很小:
map(.value = {"yes":"10","no":"0","maybe":"5"}[.value])
可以用 |=
缩短,如 peak 的解决方案:
map(.value |= {"yes":"10","no":"0","maybe":"5"}[.])
我有一个很大的 JSON 文件,我想在其中根据某种映射转换一些值。
我的数据是这样的:
[
{"id":1, "value":"yes"},
{"id":2, "value":"no"},
{"id":3, "value":"maybe"}
]
我想将其转换成这样的列表:
[
{"id":1, "value":"10"},
{"id":2, "value":"0"},
{"id":3, "value":"5"}
]
固定映射:
yes => 10
no => 0
maybe => 5
我目前的解决方案是基于这样一个简单的 if-elif-else
组合:
cat data.json| jq '.data[] | .value = (if .value == "yes" then "10" elif .value == "maybe" then "5" else "0" end)'
但这真的很难看,我希望有一种更直接的方式来表达映射。
感谢您的帮助
由于您正在翻译字符串值,因此您应该能够使用 json 对象来保存映射。那么映射将是微不足道的。
$ jq --arg mapping '{"yes":"10","no":"0","maybe":"5"}'
'map(.value |= ($mapping | fromjson)[.])' data.json
如果想避免在命令行上指定映射,那么以下两个变体可能会引起您的兴趣。
第一个变体可以与 jq 1.3、jq 1.4 和 jq 1.5 一起使用:
def mapping: {"yes":"10","no":"0","maybe":"5"};
map(.value |= mapping[.])
下一个变体使用 --argfile 选项(自 jq 1.4 起可用),如果映射对象在文件中可用,则很有趣:
jq --argfile mapping mapping.jq 'map(.value |= $mapping[.])' data.json
最后,在 jq 1.5 中,其他基于 import 的替代方案也可用 (!)。
这是一个使用 "inline" 对象的解决方案,因为映射很小:
map(.value = {"yes":"10","no":"0","maybe":"5"}[.value])
可以用 |=
缩短,如 peak 的解决方案:
map(.value |= {"yes":"10","no":"0","maybe":"5"}[.])