簡體   English   中英

如何過濾掉具有特定屬性的元素(或保留沒有該屬性的元素)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM