2015-11-27 39 views
1

我有一個JSON數據作爲data.json文件迭代通過JSON陣列中殼牌腳本

[{"original_name":"pdf_convert","changed_name":"pdf_convert_1"},{"original_name":"video_encode","changed_name":"video_encode_1"},{"original_name":"video_transcode","changed_name":"video_transcode_1"}] 

我想通過陣列迭代和爲在一個循環中的每個元素中提取的值如下。我看到了jq。我發現很難用它來迭代。我怎樣才能做到這一點?

+0

看起來'jq'有'foreach'命令,你試過了嗎? – Kevin

+0

老實說,我認爲你會對一個簡單的Python腳本更滿意。您甚至可以使用heredoc語法將它嵌入到shell腳本中。 – 5gon12eder

+0

你可以舉一個嵌入python到shell腳本的例子嗎? – user3288346

回答

0

嘗試圍繞此示例進行構建。 (來源:原始網站)

實施例:

jq '[foreach .[] as $item ([[],[]]; if $item == null then [[],.[0]]  else [(.[0] + [$item]),[]] end; if $item == null then .[1] else empty end)]' 

Input [1,2,3,4,null,"a","b",null]

Output [[1,2,3,4],["a","b"]]

+0

原始問題含糊不清,但我不認爲用戶需要「foreach」是必要的。 – chepner

6

只需使用一個過濾器,將所述陣列中返回每個項目。然後循環查看結果,只要確保使用緊湊輸出選項(-c),以便將每個結果放在一行中,並將其視爲循環中的一個項目。

jq -c '.[]' input.json | while read i; do 
    # do stuff with $i 
done 
+1

'for'循環迭代空白分隔的單詞,而不是行。 – chepner

+0

是的,你是對的,雖然在這個特定的情況下,它可能沒有問題,因爲任何對象都沒有空格。但這個想法仍然是一樣的,循環機制可能是錯誤的選擇。 –

1

在這個線程較早的答案用JQ的foreach建議,但是這可能比需要的更復雜,尤其是考慮到既定的任務。具體而言,foreach(和reduce)適用於需要累積結果的某些情況。

在很多情況下(包括最終需要減少一些步驟的情況),最好使用.[]map(_)。後者只是另一種寫作方式[。] _],所以如果你打算使用jq,理解這一點真的很有用。[]簡單地創建了一個的值。 例如,[1,2,3] | .[]會生成三個值的流。

想要一個簡單的map-reduce示例,假設您想要查找一個字符串數組的最大長度。一種解決方案是[ .[] | length] | max