[英]jq select subset of nested keys
我正在嘗試在 jq 之上為 json 文件構建一個 SQL 層,我想實現選擇。 到目前為止,我得到了:
function join() {
# If no arguments, do nothing.
# This avoids confusing errors in some shells.
if [ $# -eq 0 ]; then
return
fi
local joiner="$1"
shift
while [ $# -gt 1 ]; do
printf "%s%s" "$1" "$joiner"
shift
done
printf '%s\n' "$1"
}
function jselect {
keys=`join "\":1, \"" $@`
jq "with_entries(select(.key | in({\"$keys\":1})))"
}
允許我做
$ echo '{"success":true, "failure":false, "results":{"a": "...", "b": "...", "c": "..."}}' | jselect success results
>>> {
"success": true,
"results": {
"a": "...",
"b": "...",
"c": "..."
}
}
但我希望能夠索引嵌套屬性以及類似的內容:
$ echo '{"success":true, "failure":false, "results":{"a": "...", "b": "...", "c": "..."}}' | jselect success results
>>> {
"success": true,
"results": {
"b": "..."
}
}
or
>>> {
"success": true,
"results.b": "..."
}
任何的想法?
除非我不明白您的要求,否則我認為不需要多余的shell腳本,您可以使用簡單的jq
腳本:
echo '{"success":true, "failure":false, "results":{"a": "...", "b": "...", "c": "..."}}' | jq '{ success, results }'
jq腳本僅選擇所需的2個對象。 請注意,每個對象使用1個關鍵字的簡短形式(而不是"success":.success
)。
echo '{"success":true, "failure":false, "results":{"a": "...", "b": "...", "c": "..."}}' | jq '{ success, "results.b":.results.b }'
除了對象名稱是顯式的,此腳本幾乎相同。
作為一種替代解決方案,您可以考慮使用步行路徑unix工具jtc
來處理JSON-使用jtc
可以通過多種方式來實現您的要求,但最巧妙的方法是僅將那些走過的條目留在JSON中(並清除所有內容)其他):
bash $ echo '{"success":true, "failure":false, "results":{"a": "...", "b": "...", "c": "..."}}' | jtc -w[success] -w[results][b] -pp
{
"results": {
"b": "..."
},
"success": true
}
bash $
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.