【问题标题】:jq: Insert values according to mappings from external filejq:根据来自外部文件的映射插入值
【发布时间】:2019-04-10 09:16:59
【问题描述】:

我想知道如何通过命令行 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如何实现上述操作? 提前致谢!

【问题讨论】:

标签: json mapping jq


【解决方案1】:

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

【讨论】:

  • 谢谢!但我总是收到错误jq: error: dict/0 is not defined at <top-level>,我尝试了几种解决方案但无法修复它...
  • 我已经使用 jq 1.4、jq 1.5 和 jq 1.6 验证了所有内容。也许您没有正确引用事物。我建议将 jq 程序放入一个文件中,并使用 -f 选项。此外,您提供的错误消息表明您忘记了美元符号。
  • 谢谢@peek。当我简单地将 jq 程序移动到文件中时,它就可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
  • 2020-03-22
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
相关资源
最近更新 更多