我正在嘗試使用流從頂級 JSON 物件中提取值jq。為了便于說明,這就是資料的樣子(實際資料相當大,因此需要使用流式傳輸):
{
"empty": null,
"name": "John Smith",
"sex": "male",
"age": 51,
"hobbies": [
"running",
"kayaking",
"camping",
"foraging"
]
}
沒有流媒體很容易得到我需要的東西:
$ jq ".name" sample.json
"John Smith"
$ jq ".age" sample.json
51
$ jq ".hobbies" sample.json
[
"running",
"kayaking",
"camping",
"foraging"
]
當我使用流式傳輸時,我可以獲得"hobbies"密鑰的值:
$ jq -cn --stream 'fromstream(1|truncate_stream(inputs | select(.[0][0] == "hobbies")))' <sample.json
["running","kayaking","camping","foraging"]
"name"但是對or鍵使用類似的命令"age"會給出一個空結果:
$ jq -cn --stream 'fromstream(1|truncate_stream(inputs | select(.[0][0] == "name")))' <sample.json
$ jq -cn --stream 'fromstream(1|truncate_stream(inputs | select(.[0][0] == "age")))' <sample.json
我懷疑這是因為該值是標量。但我不確定這就是原因,即使我是,我也不確定如何使用這些資訊。
我發現了debug似乎對情況有所了解的操作。
$ jq -cn --stream 'fromstream(1|truncate_stream(inputs | select(.[0][0] == "hobbies") | debug))' <sample.json
["DEBUG:",[["hobbies",0],"running"]]
["DEBUG:",[["hobbies",1],"kayaking"]]
["DEBUG:",[["hobbies",2],"camping"]]
["DEBUG:",[["hobbies",3],"foraging"]]
["DEBUG:",[["hobbies",3]]]
["running","kayaking","camping","foraging"]
["DEBUG:",[["hobbies"]]]
$ jq -cn --stream 'fromstream(1|truncate_stream(inputs | select(.[0][0] == "name") | debug))' <sample.json
["DEBUG:",[["name"],"John Smith"]]
$ jq -cn --stream 'fromstream(1|truncate_stream(inputs | select(.[0][0] == "age") | debug))' <sample.json
["DEBUG:",[["age"],51]]
所以看起來這些值正在被選擇,但它們只是沒有通過輸出。
任何建議,將不勝感激!謝謝你。
uj5u.com熱心網友回復:
1 | truncate_stream()在隨后應用其他過濾器運算式之前,您需要了解其作業原理。truncate_stream()帶有非零整數的前綴用于洗掉流式結果中由整數指定的路徑。
例如,如果您的原始結果產生以下[path, value]對
jq -cn --stream 'inputs' json
[["empty"],null]
[["name"],"John Smith"]
[["sex"],"male"]
[["age"],51]
[["hobbies",0],"running"]
[["hobbies",1],"kayaking"]
[["hobbies",2],"camping"]
[["hobbies",3],"foraging"]
[["hobbies",3]]
[["hobbies"]]
截斷 with1將洗掉提供的每個路徑的第一個元素。那些路徑被移除的人完全從輸出中丟棄
jq -cn --stream '1|truncate_stream(inputs)' json
[[0],"running"]
[[1],"kayaking"]
[[2],"camping"]
[[3],"foraging"]
[[3]]
您最初的嘗試奏效了,因為select運算式能夠獲得所需的路徑hobbies,洗掉了父根鍵hobbies,只保留了一個元素串列。
但這同樣不適用于age,因為您無法完全修剪掉路徑。洗掉["age"]條目會留下一個結果,因為[[],51]只留下值欄位。
jq -cn --stream 'inputs|select(.[0][0] == "age")' json
[["age"],51]
1|..如果為上述運算式提供了一個級別,即age路徑將被完全洗掉,則fromstream不會構造您的物件。
因此,對于簡單的標量,只需從索引中提取值,如下所示,根本不需要使用 truncate
jq -cn --stream 'inputs|select(.[0][0] == "age")[1]'
51
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/512446.html
標籤:json溪流jq
上一篇:兩個可能的影像路徑,一個后備影像
