【问题标题】:Accessing field with jq that contains a special character and can be an object or an array [duplicate]使用 jq 访问包含特殊字符并且可以是对象或数组的字段 [重复]
【发布时间】:2018-03-22 11:29:41
【问题描述】:

我在 file.json 中有大量数据转储,如下所示:

[{
   "recordList" : {
      "record" : [{
          "Production" : {
              "creator.role" : {
                  "term" : "A"
              }
          }
      },
      {
          "Production" : {}
      },
      {
          "Production" : {
              "creator.role" : {
                  "term" : ""
              }
          }
      },
      {
          "Production" : [
              {
              "creator.role" : {"term" : "B"}
              },
              {
              "creator.role" : {"term" : ""}
              }
          ]
      }]
   }
}]

我需要检查记录中是否至少有一个“creator.role”的“术语”(不为空)。如果有,我在 CSV 文件中为该字段提供 1,否则为 0。

感谢之前帖子中的答案,我设法访问了一个字段“创建者”,尽管它可能是一个对象或数组(请参阅:Accessing field with jq that can be string or array)。

但是现在对于带有特殊字符'.'的字段'creator.role'我也有同样的问题。并且不知道如何处理。

我试过的代码:

jq -r '.[].recordList.record[].Production | "\(if ((type == "array" and .[0]["creator.role"].term and .[0]["creator.role"].term !="") or (type == "object" and ["creator.role"].term and ["creator.role"].term !="")) then 1 else 0 end),"' file.json

我收到此错误:

Cannot index array with string "term"

在这种情况下我想得到的输出是:

1,
0,
0,
1,

【问题讨论】:

  • 注意,你的最后一个"Production" : [{}...] 项目最终将包含一个带有一个键的对象,而不是2。对象不能有重复的键,这就是它会“折叠”的原因。您的最后一个 "Production" 项目不能使用 1,
  • 好吧,我明白了。最后一个“生产”应该有 2 个对象而不是 1 个。
  • 我在我的问题中更改了它。这样那部分就解决了,但是我仍然不知道在这种情况下如何处理特殊字符。

标签: arrays object special-characters jq is-empty


【解决方案1】:

jq解决方案:

jq -r '.[].recordList.record[].Production 
       | "\(if ((type == "array" and any(.["creator.role"].term !="")) 
            or (type == "object" and .["creator.role"].term and .["creator.role"].term !=""))
            then 1 else 0 end),"' file.json

【讨论】:

  • 行得通!非常感谢所有的帮助:D!
猜你喜欢
  • 2012-10-08
  • 2021-04-17
相关资源
最近更新 更多