jq:根据来自外部文件的映射插入值

时间:2018-11-06 22:30:15

标签: json mapping jq

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

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

现在我还有另一个文件将feature映射到value

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实现以上操作? 预先感谢!

1 个答案:

答案 0 :(得分:0)

假设文本文件位于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")拆分整个文件可能导致的任何空字符串。