[英]jq - parsing& replacement based on key-value pairs within json
我有一个键-值映射形式的json文件。 例如:
{
"users":[
{
"key1":"user1",
"key2":"user2"
}
]
}
我还有另一个json文件。 必须根据第一个文件中的键替换第二个文件中的值。
例如,第二个文件是:
{
"info":
{
"users":["key1","key2","key3","key4"]
}
}
第二个文件应替换为
{
"info":
{
"users":["user1","user2","key3","key4"]
}
}
因为第一个文件中的key1的值为user1。 这可以用任何python程序完成,但是我正在学习jq,并想尝试一下jq本身是否可行。 我尝试了使用slurpfile读取文件的不同组合,然后选择&walk等。但是无法达到所需的解决方案。
任何建议相同的将不胜感激。
jq
解决方案:
jq --slurpfile users 1st.json '$users[0].users[0] as $users
| .info.users |= map(if in($users) then $users[.] else . end)' 2nd.json
输出:
{
"info": {
"users": [
"user1",
"user2",
"key3",
"key4"
]
}
}
由于.users [0]是JSON字典,因此按原样使用它(例如,为了提高效率)将是有意义的:
调用:jq -c --slurpfile users users.json -f program.jq input.json
program.jq:
$users[0].users[0] as $dict
| .info.users |= map($dict[.] // .)
输出:
{"info":{"users":["user1","user2","key3","key4"]}}
注意:以上假设字典中不包含任何null或false值,或者应忽略字典中的任何此类值。 这避免了原本需要的双重查找。 如果该假设无效,则使用has
或in
的解决方案(例如,由RomanPerekhrest提供)将是适当的。
(看评论”。)
$users[0].users[0] as $dict
| second
| .info.users |= (map($dict[.] | select(. != null)))
强烈建议不要使用重定向来覆盖输入文件。 如果您有或可以安装sponge
,那么使用它会更好。 有关更多详细信息,请参见例如“ jq等同于sed -i?” 在jq FAQ中 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.