2016-03-09 41 views
2

我一直在使用精彩的JQ library解析和提取JSON數據以方便重新導入。我能夠很容易地提取一個範圍,但不確定如何在腳本中循環並檢測文件的末尾,最好是在bash或fish shell腳本中。在Bash或Fish shell中使用JQ分割/分塊JSON文件?

給定一個包含在「results」字典中的JSON文件,該如何檢測文件的結尾?

從測試中,我可以看到,我會得到嵌套在我的期望結構的空數組,但你怎麼能檢測到的文件狀態的終點?:

jq '{ "results": .results[0:500] }' Foo.json > 0000-0500/Foo.json 

謝謝!

+1

JSON不處理文件,所以你不清楚你在問什麼。 – chepner

+0

這既不是bash也不是魚問題,所以我刪除了這些標籤。 –

+0

@chepner關鍵是內容是JSON,我需要在原子json元素中分割,最好是用bash或fish,因此也就是標籤。 –

回答

1

我建議使用jq將數組拆分爲所需的JSON對象流(每行一個),然後使用其他工具(例如awk)來填充文件。這是第一個部分是如何可以做到:

def splitup(n): 
    def _split: 
    if length == 0 then empty 
    else .[0:n], (.[n:] | _split) 
    end; 
    if n == 0 then empty elif n > 0 then _split else reverse|splitup(-n) end; 

# For the sake of illustration: 
def data: { results: [range(0,20)]}; 

data | .results | {results: splitup(5) } 

調用:

$ jq -nc -f splitup.jq 
{"results":[0,1,2,3,4]} 
{"results":[5,6,7,8,9]} 
{"results":[10,11,12,13,14]} 
{"results":[15,16,17,18,19]} 

對於第二部分,你可以(例如)管道JQ輸出:

awk '{ file="file."++n; print > file; close(file); }' 

一你可能會感興趣的變體會有jq過濾器在備用行上同時發出文件名和JSON; awk腳本也會讀取文件名。