【问题标题】:How get index of array with jq如何用jq获取数组的索引
【发布时间】:2020-06-09 07:25:55
【问题描述】:

我想在那个结构中搜索这个字符串tb1qpvtnfqqs3cp4ly4375km7n5sga8hkdkujkm854

{
  "txid": "67bc5194442dc350312a7c0a5fc7ef912c31bf00b23349b4c3afdf177c91fb2f",
  "hash": "8392ded0647e4166eda342cee409c7d0e1e3ffab24de41866d2e6a7bd0a245b3",
  "version": 2,
  "size": 245,
  "vsize": 164,
  "weight": 653,
  "locktime": 1764124,
  "vin": [
    {
      "txid": "69eed058cbd18b3bf133c8341582adcd76a4d837590d3ae8fa0ffee1d597a8c3",
      "vout": 0,
      "scriptSig": {
        "asm": "0014759fc698313da549948940508df6db93a319096e",
        "hex": "160014759fc698313da549948940508df6db93a319096e"
      },
      "txinwitness": [
        "3044022014a8eb758063c52bc970d42013e653f5d3fb3c190b55f7cfa72680280cc5138602202a873b5cad4299b2f52d8cccb4dcfa66fa6ec256d533788f54440d4cdad7dd6501",
        "02ec8ba22da03ed1870fe4b9f9071067a6a1fda6f582c5c858644e44bd401bfc0a"
      ],
      "sequence": 4294967294
    }
  ],
  "vout": [
    {
      "value": 0.37841708,
      "n": 0,
      "scriptPubKey": {
        "asm": "0 686bc8ce41505642c96f3eb99919fff63f4c0f11",
        "hex": "0014686bc8ce41505642c96f3eb99919fff63f4c0f11",
        "reqSigs": 1,
        "type": "witness_v0_keyhash",
        "addresses": [
          "tb1qdp4u3njp2pty9jt086uejx0l7cl5crc3x3phwd"
        ]
      }
    },
    {
      "value": 0.00022000,
      "n": 1,
      "scriptPubKey": {
        "asm": "0 0b173480108e035f92b1f52dbf4e90474f7b36dc",
        "hex": "00140b173480108e035f92b1f52dbf4e90474f7b36dc",
        "reqSigs": 1,
        "type": "witness_v0_keyhash",
        "addresses": [
          "tb1qpvtnfqqs3cp4ly4375km7n5sga8hkdkujkm854"
        ]
      }
    }
  ],
  "hex": "02000000000101c3a897d5e1fe0ffae83a0d5937d8a476cdad821534c833f13b8bd1cb58d0ee690000000017160014759fc698313da549948940508df6db93a319096efeffffff022c6b410200000000160014686bc8ce41505642c96f3eb99919fff63f4c0f11f0550000000000001600140b173480108e035f92b1f52dbf4e90474f7b36dc02473044022014a8eb758063c52bc970d42013e653f5d3fb3c190b55f7cfa72680280cc5138602202a873b5cad4299b2f52d8cccb4dcfa66fa6ec256d533788f54440d4cdad7dd65012102ec8ba22da03ed1870fe4b9f9071067a6a1fda6f582c5c858644e44bd401bfc0a1ceb1a00",
  "blockhash": "000000009acb8b4f06a97beb23b3d9aeb3df71052dabec94465933b564c27f50",
  "confirmations": 2,
  "time": 1591687001,
  "blocktime": 1591687001
}

我想获取 vout 的索引,在这种情况下是 1. jq 可以吗?

【问题讨论】:

  • index是指.vout中的索引还是“n”对应的值?如果没有“n”键怎么办?如果找不到字符串怎么办?如果出现多次怎么办?

标签: arrays json bash jq


【解决方案1】:

不清楚你到底想要什么。

我猜你想要vout 的元素的n,它在其地址列表中包含给定地址。这可以通过

来实现
jq '.vout[]
    | select(.scriptPubKey.addresses[] == "tb1qpvtnfqqs3cp4ly4375km7n5sga8hkdkujkm854")
    | .n
   ' file.json

你也可以使用

select((.scriptPubKey.addresses[]
    | contains("tb1qpvtnfqqs3cp4ly4375km7n5sga8hkdkujkm854")))

搜索地址。

【讨论】:

    【解决方案2】:

    以下假设您希望将给定字符串作为叶值的第一个对象的 .vout 中的索引,并且您考虑使用 0 作为索引原点。

    一个查找所有此类索引的简单且相当有效的 jq 程序如下:

    .vout
    | range(0;length) as $i
    | if any(.[$i]|..;
             . == "tb1qpvtnfqqs3cp4ly4375km7n5sga8hkdkujkm854") 
      then $i 
      else empty
      end
    

    对于给定的输入,这实际上产生 1,这与问题描述一致,因此我们似乎走在正确的轨道上。

    要获得第一个索引,您可以将上面的内容包装在 first(...) 中,但在这种情况下,如果没有出现,结果将是空流。因此,也许您更愿意将上述内容包装在first(...) // null

    【讨论】:

    • 这个range ... as 语法有记录吗?
    • ... 是省略号。将 ... 替换为感兴趣的代码。
    猜你喜欢
    • 2017-06-16
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多