【问题标题】:Conditional jq extraction of two elements in different places of hierarchy条件jq提取层次结构不同位置的两个元素
【发布时间】:2021-07-24 01:24:10
【问题描述】:

我有一个 json 文档,当 035.subfields[].ind1 和 035.subfields[].ind2 均为“0”时,我需要提取标签 035 和 999 的子字段 a 的值。这是我的文件:

{
  "leader": "01815cam a22004934a 4500",
  "fields": [
    {
      "001": "mig00005597434"
    },
    {
      "035": {
        "subfields": [
          {
            "a": "(OCoLC)67764532"
          }
        ],
        "ind1": " ",
        "ind2": " "
      }
    },
    {
      "035": {
        "subfields": [
          {
            "a": "ocm00000001projmusemuse13792"
          }
        ],
        "ind1": "0",
        "ind2": "0"
      }
    },
    {
      "245": {
        "subfields": [
          {
            "a": "The Sins of the Father"
          },
          {
            "b": "A Romance of the South /"
          },
          {
            "c": "by Thomas Dixon ; with an introduction by Steven Weisenburger."
          }
        ],
        "ind1": "1",
        "ind2": "4"
      }
    },
    {
      "999": {
        "subfields": [
          {
            "i": "a1b7fa7e-9e2e-4973-96d0-3939235c8b80"
          },
          {
            "s": "020d182f-ba5d-4bbe-a2eb-e4390aa0736c"
          }
        ],
        "ind1": "f",
        "ind2": "f"
      }
    }
  ]
}

我想要的输出是

ocm00000001projmusemuse13792     020d182f-ba5d-4bbe-a2eb-e4390aa0736c

当我尝试获取这两个值时,

jq -r '.fields[] | [(select(."035".ind1 == "0" and ."035".ind2 == "0") | ."035".subfields[].a), (select(."999") |."999".subfields[].s)] '

我明白了

[]
[]
[
  "ocm00000001projmusemuse13792"
]
[]
[
  null,
  "020d182f-ba5d-4bbe-a2eb-e4390aa0736c"
]

但是我尝试移动 999 选择的其他变体(例如

jq '.fields[] | [(select(."035".ind1 == "0" and ."035".ind2 == "0") | ."035".subfields[].a), (select(."999".subfields[].s) | ."999".subfields[].s)] '

我知道我不能迭代 null。我错过了什么?

【问题讨论】:

    标签: json select conditional-statements jq


    【解决方案1】:

    使用 -r 命令行选项,过滤器:

    [.fields[]
     | (select(."035".ind1 == "0" and ."035".ind2 == "0")
        | (."035".subfields[] | select(.a) | .a) ),
       (select(."999")
        | (."999".subfields[] | select(.s) | .s) ) ]
    | join(" ")
    

    产量:

    ocm00000001projmusemuse13792 020d182f-ba5d-4bbe-a2eb-e4390aa0736c
    

    【讨论】:

    • 看起来我并没有全神贯注于 select 语句。喜欢你的语法——超级容易理解
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多