2015-12-23 59 views
4

我想將json文件拆分爲各種json文件。輸入(r1.json)看起來像:如何使用jq在bash中創建for循環

{ 

    "results" : [ 

       { 
      content 1 
} 
, 
{ 
      content 2 
} 
, 
{ 
      content n 
} 

    ] 
} 

我想輸出爲n個文件:1.json,2.json,n.json。分別包含{content 1},{content 2}和{content n}。

我想:

for i in {0..24}; do cat r1.json | jq '.results[$i]' >> $i.json; done 

但我有以下錯誤:錯誤:我沒有定義

+2

給[shellcheck(http://www.shellcheck.net)一去!在這種情況下,它表示「表達式不會用單引號擴展,用雙引號表示。 –

+0

好的鏈接,thx很多,它允許我在{0..24}中修改我的命令'code'。做jq <「r1.json」「.results [$ i]」> .json; done'code' – crocefisso

回答

2

雖然上面的答案是正確的,請注意,JQ腳本插值shell變量是所有一個可怕的想法,但最瑣碎的腳本。在任何所提供的解決方案,替換以下:

jq ".results[$i]" 

下列要求:

jq --arg i "$i" '.results[$i | tonumber]' 
+0

非常感謝你的提示@Santiago Lapresta。事實上,我上面提到的簡單線路運行良好,但沒有使用jq --arg,但對於更詳細的問題,會出現問題。你使用jq --arg作爲嵌套循環,例如我的腳本應該做一些像[that](https://www.dropbox.com/s/83ouwgo62eoyov1/SOF.sh?dl=0) – crocefisso

+1

我不'你真的明白這個腳本是幹什麼的嗎?你能提供一個更簡單的例子嗎?你最好不要在jq之外使用循環時間;只需在jq進程中使用'range'就可以了。 關於'--arg',如果你需要傳入幾個變量,你可以做多個'--arg'調用。 另外,考慮到你鏈接的腳本;你應該在jq上使用'-r'而不是用'sed'去掉引號。 –

+0

終於我發現[解決方案](http://stackoverflow.com/questions/34509937/how-can-i-do-jq-nested-for-loops-from-bash)到嵌套循環問題。你會知道一些很好的文檔來理解jq是如何工作的嗎? – crocefisso

2

嘗試

for i in {0..24}; do cat r1.json | jq ".results[$i]" >> $i.json; done 

注意shell變量不能內擴大單引號。

IHTH

+0

非常感謝! – crocefisso

+1

請點擊外部左上角的綠色箭頭接受解答您的問題的答案的答案;-)。很高興幫助。 – shellter

2

單引號可能是你搞砸了。 Bash變量不會用單引號擴展。您正在傳遞一個文字字符串.results[$i]jq。嘗試雙引號來代替:

for i in {0..24}; do 
    cat r1.json | jq ".results[$i]" >> $i.json 
done