[英]How to filter out elements with a particular property (or keep elements without that property)
我正在處理來自 dcm2json 的output ,它將元數據從 DICOM 格式的醫學成像數據轉換為 JSON。 此元數據的值主要是字符串、整數、浮點數等,但它也包括 base64 編碼字符串形式的內聯二進制值。 我們不需要這些二進制文件,它們會變得非常大,所以我需要過濾掉所有具有 InlineBinary 屬性的元數據元素。 下面是來自 dcm2json 的 JSON output 的(非常簡單的小)示例:
{
"00080005": {
"vr": "CS",
"Value": ["ISO_IR 192"]
},
"00291010": {
"vr": "OB",
"InlineBinary": "Zm9vYmFyCg=="
}
}
我想將其轉換為:
{
"00080005": {
"vr": "CS",
"Value": ["ISO_IR 192"]
}
}
我嘗試了一些沒有用的不同方法,但最終還是使用了這個:
$ dcm2json file.dcm | jq '[to_entries | .[] | select(.value.Value)] | from_entries'
不過我一直在玩它,因為我不喜歡將該表達式嵌入到數組中(即[to_entries...]
)。 我想出了一些更優雅的東西,但我完全不知道為什么它會這樣工作:
jq 'to_entries | . - map(select(.value | has("InlineBinary") == true)) | from_entries' | less
令人困惑的是has("InlineBinary") == true
位。 我首先將它與false
進行比較,因為我想要的是那些沒有InlineBinary
屬性的元素。 為什么它看起來與我認為我要求的相反? 鑒於我真的不明白. - map(...)
. - map(...)
結構(我完全從另一篇有人問過類似問題的帖子中刷了它),我並不驚訝它做了我不明白的事情,但我想了解為什么會這樣: )
我感到困惑的另一件事是to_entries/from_entries/with_entries
。 該手冊說明了這些:
with_entries(foo) 是 to_entries 的簡寫 | 地圖(foo) | from_entries
酷:所以那將是:
jq 'with_entries(map( . - map(select(.value | has("InlineBinary") == true))))'
但這不起作用:
$ cat 1.json | jq 'with_entries(map(. - map(select(.value | has("InlineBinary") == true))))'
jq: error (at <stdin>:848): Cannot iterate over string ("00080005")
鑒於此語句應該在功能上等效,我不確定為什么這不起作用。
感謝您提供的任何信息!
選擇鍵值對時, with_entries
通常是首選工具:
with_entries( select(.value | has("InlineBinary") | not) )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.