当前位置: 首页 > 面试题库 >

使用jq将x = y对变成键/值对

罗允晨
2023-03-14
问题内容

我正在尝试从的JSON输出解析环境变量docker inspect。令人讨厌的是,这些环境变量没有作为有用的键值对返回。它们只是x =
y字符串的数组。这是输出的相关代码段:

[
    {
        "Config": {
            "Env": [
                "JENKINS_HOST=1.2.3.4",
                "JENKINS_INSTANCE=tea",
                "JENKINS_NAME=Enterprise Architecture Tools",
                "JENKINS_VERSION=2.46.2",
                "JENKINS_PROTOCOL=http"
            ]
        }
    }
]

我想将该数组转换为这样的东西:

{
  "Config": {
    "Env": {
      "JENKINS_HOST": "1.2.3.4",
      "JENKINS_INSTANCE": "tea",
      "JENKINS_NAME": "Enterprise Architecture Tools",
      "JENKINS_VERSION": "2.46.2",
      "JENKINS_PROTOCOL": "http"
    }
  }
}

这样,我可以使用一条命令jq '.[] | .Config.Env.JENKINS_HOST'来获取我关心的值。我不知道如何做到这一点。

选择数据甚至将键和值拆分为单独的元素相对容易。例如,如果使用jq '.[] | .Config.Env | .[] | split("=")',我将获得如下数据:

[
  "JENKINS_HOST",
  "1.2.3.4"
]
[
  "JENKINS_INSTANCE",
  "tea"
]
[
  "JENKINS_NAME",
  "Enterprise Architecture Tools"
]
[
  "JENKINS_VERSION",
  "2.46.2"
]
[
  "JENKINS_PROTOCOL",
  "http"
]

但是,我不知道如何将数据转换为对象分配。似乎应该是map或的某种组合reduce,但是我很困惑。谁能指出我正确的方向?


问题答案:

要将两个字符串(例如[“ k”,“ v”])的数组转换为对象,可以编写:

{ (.[0]) : .[1] }

因此,您需要编写类似以下内容的内容:

 map(.Config.Env |= (map( split("=") | { (.[0]) : .[1] } ) | add))

2点

抽象出数组到对象的功能使解决方案更易于理解:

def a2o: map( split("=") | { (.[0]) : .[1] } ) | add;

map(.Config.Env |= a2o)

使用matchcapture代替split

由于可能在每个var=value字符串的“值”部分出现“
=”字符,因此split天真地使用可能不是一个好主意。假设您的jq支持正则表达式,这是一个更可靠的选择:

match("([^=]*)=(.*)") | .captures | {(.[0].string) : .[1].string}

或者,更简洁一些,也可能更优雅一些:

[capture( "(?<key>[^:]*):(?<value>.*)" )] | from_entries

index/1

如果您的jq不支持正则表达式,则可以index/1按照以下方式使用:

index("=") as $ix | {(.[:$ix]) : .[$ix+1:]}


 类似资料:
  • 我有这个JSON: 我想打印键值对,其中键匹配状态和选项,以及时间和它的值。我可以通过使用下面的命令打印时间和所有键值对,但不确定如何提取特定的键值对。 这将产生以下输出: 但我想要的结果是:

  • 问题内容: 几年前我有这个面试问题,但是我还没有找到答案。 做无限循环的x和y应该是什么? 我们试着用,, VS 。 问题答案: 您需要两个可比较,具有相同值但代表不同实例的变量,例如: 和都为true,因为取消了装箱,但是实例相等性为false。 请注意,它也可以与一起使用,并且任何值(不仅是0)都可以使用。 您还可以使用JVM的复杂性-它们通常仅缓存最多127个整数,因此也可以使用: (但是1

  • 问题内容: 我试图用来构造一个哈希值,其中键名来自变量。像这样: 但是,这不起作用,并出现以下错误: 问题答案: 使用括号可以尽早评估:

  • 问题内容: 我有以下json文件: 我正在使用jq,并想获取“位置”为“斯德哥尔摩”的对象的“名称”元素。 我知道我可以通过 但是给定子键的值(在此),我无法弄清楚如何仅打印某些对象。 问题答案: 根据关于使用jq处理JSON的文章改编而成,您可以这样使用:

  • 虽然很多 Spark 操作工作在包含任意类型对象的 RDDs 上的,但是少数几个特殊操作仅仅在键值(key-value)对 RDDs 上可用。最常见的是分布式 "shuffle" 操作,例如根据一个 key 对一组数据进行分组和聚合。 在 Scala 中,这些操作在包含二元组(Tuple2)(在语言的内建元组中,通过简单的写 (a, b) 创建) 的 RDD 上自动地变成可用的,只要在你的程序中导

  • 问题内容: 我需要在Seaborn distplot上绘制与某些X值相对应的点,以使它们落在密度曲线上或低于密度曲线。这是来自以下URL的distplot: 从Seaborn网站-distplot示例 因此,例如,在上面显示的曲线图中,我需要以编程方式确定与落在密度曲线上的X值0对应的Y轴值是多少。从图中看来,它大约在0.37左右。如何在我的程序中得到它? 假设可以做到,那么我如何在所示的图中显示