【问题标题】:Check and copy values from bash array to json array检查并将值从 bash 数组复制到 json 数组
【发布时间】:2018-08-03 08:16:59
【问题描述】:

我有两个 bash 数组。

ID=(1 2 3 4...) VALUES=("/path1" "/path2" "/path3" "/path4"...)

我想将相应的值添加到 JSON 数组中

[
{
  "Id": "1",
  "Path": "/path1"
},
{
  "Id": "2",
  "Path": "/path2"
}
...
]

在添加值之前,我想检查元素是否已经存在,如果存在则跳过。我怎样才能在 bash 脚本(或 python,如果这样更好的话)中实现它

【问题讨论】:

    标签: python arrays json bash jq


    【解决方案1】:

    这些要求对我来说并不完全清楚,但以下内容应该足以让您顺利上路。

    请注意,以下假设原始换行符既不出现在 ID 也不出现在 VALUES 中。

    还要注意,在下文中,每个 ID 和 VALUES 数组的第一个和最后一个元素是相同的。这是为了行使一项要求。

    #!/bin/bash
    ID=(1 2 3 4 1)
    VALUES=("/path1" "/path2" "/path3" "/path4" "/path1")
    
    ID=$(printf "%s\n" "${ID[@]}")
    VALUES=$(printf "%s\n" "${VALUES[@]}")
    
    jq -n --arg id "$ID" --arg values "$VALUES" '
      # emit a dictionary
      def set(s): reduce s as $x ({};
        .[$x | (type[0:1] + tostring)] = $x);
    
      # distinct entities in the stream s
      def distinct(s): set(s)[];
    
      [$id, $values]
      | map( split("\n"))
      | [distinct(transpose[])]
      | map( {Id: .[0], Path: .[1]} )
    '
    

    我们使用set/1distinct/1 而不是unique 主要是为了确保按照要求指定的顺序保留,同时也是为了避免unique 所包含的sort

    输出:

    [
      {
        "Id": "1",
        "Path": "/path1"
      },
      {
        "Id": "2",
        "Path": "/path2"
      },
      {
        "Id": "3",
        "Path": "/path3"
      },
      {
        "Id": "4",
        "Path": "/path4"
      }
    ]
    

    【讨论】:

      猜你喜欢
      • 2015-01-06
      • 2018-10-14
      • 2017-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-04
      • 2021-04-21
      相关资源
      最近更新 更多