簡體   English   中英

帶有嵌套JSON的JQ

[英]JQ with nested JSON

您好,我是JQ和命令行工具的新手,所以我真的迷失了。 我有以下形式的JSON文件:

{
    "Z": {
        "00": [{
                "e": "A000"
            }, {
                "e": "A020"
            }
        ],
        "01": [{
                "e": "A102"
            }, {
                "e": "C027"
            }
        ]
    },
    "X": {
        "00": [{
                "e": "P002"
            }, {
                "e": "T027"
            }
        ],
        "01": [{
                "e": "A003"
            }, {
                "e": "A020"
            }
        ]
    }
}

其中每個對象是一個七個字符的字母數字代碼。

我正在尋找的是一個命令,用於輸出用換行符分隔的每個代碼,如下所示:

Z00A000
Z00A020
Z01A102
Z01C027
X00P002
X00T027
X01A003
X01A020

盡管名稱“ Z”和“ X”以及子名稱“ 00”“ 01”等易於更改,所以JSON的格式始終相同,因此無法對其進行硬編碼。

如前所述,我對此並不陌生,而最近的是

jq '.[] | .[] | .[] | .e'

其中列出了代碼的最后四個字符。

老實說,我完全迷路了,因此不勝感激。 謝謝閱讀。

這是基於格式統一性的解決方案。

首先,讓我們定義一個輔助函數,該函數處理JSON對象,其值是{"e": _}形式的對象數組:

def combine:
  keys_unsorted[] as $k
  | $k + (.[$k][]|.e) ;

現在,解決方案可以只用兩行編寫:

keys_unsorted[] as $k
| $k + (.[$k]|combine)

使用-r命令行選項將導致發出字符串而不會將引號引起來。

另一種策略

以下內容不僅更加籠統,而且還說明了可以進一步推廣和推廣各種不同的策略:

paths as $p
| getpath($p) as $v
| select($v | type == "string")
| $p
| map(select(type=="string"))
| map(select(. != "e"))
| . + [$v]
| join("")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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