首页 > 解决方案 > jq:根据来自外部文件的映射插入值

问题描述

我想知道如何通过命令行 jq 完成此任务。我组成了一个具有类似嵌套结构的文件,如下所示:

{
    "item": "item1",
    "features": [
        {
            "feature": "feature_a",
            "value": ""
        },
        {
            "feature": "feature_b",
            "value": ""
        }
     ]
}

现在我有另一个文件映射featurevalue

feature_a value_1
feature_b value_2

所以我想value根据地图将其插入到第一个 json 文件中,得到以下输出:

{
    "item": "item1";
    "features": [
        {
            "feature": "feature_a",
            "value": "value_1"
        },
        {
            "feature": "feature_b",
            "value": "value_2"
        }
     ]
}

我怎样才能实现上述操作jq?提前致谢!

标签: jsonmappingjq

解决方案


假设文本文件在 dict.txt 中,JSON 文件在 source.json 中,调用

jq -Rs --argfile target source.json dict.txt '
  ([ split("\n")[]
     | select(length>0) 
     | split(" ") 
     | { (.[0]): .[1]} ] 
   | add) as $dict
  | $target
  | .features |= map(.value = $dict[.feature])'

将产生所需的输出。

包含的主要原因select(length>0)是跳过可能因split("\n")用于拆分整个文件而产生的任何空字符串。


推荐阅读