为什么这个 jq 表达式使用一次就有效,但两次就不行?

Why does this jq expression work if used once, but not twice?

我有一个 json 文档

{
  "total": 2000,
  "start": 0,
  "entries": [
    {
      "updatedDate": "2021-03-12T13:00:05Z",
      "createdDate": "2010-06-17T05:34:42Z",
      "deleted": false,
      "suppressed": false,
      "names": [
        "Doe, John"
      ],
      "barcodes": [
        "23082599944"
      ],
      "expirationDate": "2022-05-06",
      "emails": [
        "name@uni.edu"
      ],
      "patronType": 14,
      "patronCodes": {
        "pcode1": "-",
        "pcode2": 0
      },
      "varFields": [
        {
          "fieldTag": "b",
          "content": "23082501799944"
        },
        {
          "fieldTag": "l",
          "content": "jdoe"
        }
      ]
    }
  ]
}

我需要提取 .content,其中 fieldTag 是“b”或“l”。在例子中,我去掉了很多字段,我找的字段不会一直存在。

如果我把文件 cat 到

cat myfile |jq -r '.entries[] |
        .varFields[] |select(.fieldTag=="l") | .content // ""
'

完全符合预期但

cat myfile|jq -r '.entries[] |
        .varFields[] |select(.fieldTag=="l") | .content // "", 
        .varFields[] |select(.fieldTag=="b") | .content // "" 
'

returnsjq: error (at <stdin>:37): Cannot index string with string "fieldTag"。我似乎可以 select 任何我想要的领域,只要我只有 select 一个。否则,我得到错误。我错过了什么?

在您的查询中,您需要括号才能正确分组:

.entries[] |
 (.varFields[] | select(.fieldTag=="l") | .content // ""), 
 (.varFields[] | select(.fieldTag=="b") | .content // "")

或避免冗余扫描 .varFields:

.entries[]
| (INDEX(.varFields[]; .fieldTag) | map_values(.content)) as $dict
| $dict["l","b"]
| . // ""

如果排序不重要,并且已知“l”和“b”都存在,您也可以这样写:

.entries[]
| .varFields[] 
| select(.fieldTag | . == "l" or . == "b" ) 
| .content // ""

上面的析取词“select”也可以更干脆地写成:

select(.fieldTag | IN("l","b" ))