在shell脚本中使用两个jq映射时,我观察到以下数据的错误。
[
{
"ParameterKey": "<ans1>",
"ParameterValue": "<ans2>"
}
]
我的脚本是
cat test.json | \
jq 'map(if .ParameterKey == "<ans1>" then . + {"ParameterKey" : "input1" } else . end )' \
'map(if .ParameterValue == "<ans2>" then . + {"ParameterValue" : "input2" } else . end)' \
> result.json
答案 0 :(得分:0)
虽然未给出准确的错误,但运行命令会生成
jq: error: Could not open file map(if .ParameterValue == "<ans2>"
then . + {"ParameterValue": "input2"} else . end): No such file or directory
No such file or directory
消息表明jq正在尝试打开文件
名为“ map(if .ParameterValue == "<ans2>" then . + {"ParameterValue": "input2"} else . end)
”的名称正在发生,因为该字符串出现在jq需要输入文件名称的位置。
要纠正此问题,您可以将两个过滤字符串合并为一个|
字符串,并将test.json
作为输入文件传递,例如
jq '
map(if .ParameterKey == "<ans1>" then . + {"ParameterKey": "input1"} else . end)
| map(if .ParameterValue == "<ans2>" then . + {"ParameterValue": "input2"} else . end)
' test.json > result.json
或保留基本结构并添加第二个显式jq调用,例如
cat test.json | \
jq 'map(if .ParameterKey == "<ans1>" then . + {"ParameterKey": "input1"} else . end)' | \
jq 'map(if .ParameterValue == "<ans2>" then . + {"ParameterValue": "input2"} else . end)' \
> result.json
在这种特殊情况下,任何一种都可行,但第一种方式更有效。 <{3}}只使用一个map()
更好。
答案 1 :(得分:0)
这是两个解决方案 - 一个既简单又简短,一个可以很好地扩展。请注意,在这两种情况下, <div class="general-input-wrapper inline-arrangement">
<label class="control-label">Type</label>
<select id="diaryTypeCombobox" kendo-drop-down-list="diaryTypeCombobox" ng-model="vm.diaryType"
ng-disabled="vm.addNoteOpenFrom == 'OpenCaseDragDrop' || vm.addNoteOpenFrom == 'Organizer'"
k-on-change="vm.valueEffectsOnDiaryTypeChangedByUser()"
k-options="vm.diaryTypeOptions"
k-value-primitive="true"
style="width: 100%;"></select>
</div>
只需要一次。
map
map( if .ParameterKey == "<ans1>" then . + {"ParameterKey": "input1"} else . end
| if .ParameterValue == "<ans2>" then . + {"ParameterValue": "input2"} else . end)