为什么这个 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" ))
我有一个 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" ))