【问题标题】:Concatenate name and number field from JSON file连接 JSON 文件中的名称和数字字段
【发布时间】:2020-07-16 22:07:27
【问题描述】:
{
   "name": "ford",
   "availableVersions": [
      {
         "version": 111,
         "count": 3
      },
      {
         "version": 122,
         "count": 2
      },
      {
         "version": 133,
         "count": 3
      }
                          ],
       "RealVersion": 133


}
{
   "name": "bmw",
   "availableVersions": [
     {
         "version": 144,
         "count": 1
     },
     {
      "version": 155,
      "count": 3
     }                  ],
     "RealVersion": 120

    }

我现在有这个 demo.json 文件 if (count == 3) 我想将名称与版本连接起来。

所以我的输出应该是[ford:111,ford:133,BMW:155]。我正在使用 jq 的 json 解析。

我使用的这个命令很好用

cat demo2| jq '.name + ": " + (.availableVersions[]|select(.count == 3).version|tostring)'

但现在我还想要一个条件if (count ==3 and version != RealVersion) 然后我只想要version 我尝试了很多命令,但都没有工作。有人可以帮我解决这个问题吗?

所以预期输出 = [ford:111,BMW:155] 所以,ford:133 不会出现在输出中

【问题讨论】:

标签: json shell parsing concatenation jq


【解决方案1】:

这是一种在过滤器前面使用as 捕获.RealVersion 然后在select 中使用它的方法。

.name + ": " + (
    .RealVersion as $r
  | .availableVersions[]
  | select(.count == 3 and .version != $r).version 
  | tostring
)

样本输出

"ford: 111"
"bmw: 155"

Try it online!

【讨论】:

    【解决方案2】:

    将多个输入“blob”转换为单个输出 blob 需要 -s|--slurp,这不是非常节省内存。在实施之前,请确保这是一项要求。

    jq --compact --slurp '
        .[] |= . as $r
            | .availableVersions[]
            | select(.count == 3 and .version != $r.RealVersion)
            | "\($r.name):\(.version)"
    '
    

    输出:

    ["ford:111","bmw:155"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 2019-04-12
      • 1970-01-01
      相关资源
      最近更新 更多