2014-01-24 48 views
78

我得到這樣的答覆JSON從一個curl命令:如何使用命令行計算JSON對象中的項目?

[ 
    { 
    "cid": 49, 
    "pyn": "yi4", 
    "hans": "億", 
    "hant": "億", 
    "tid": 68, 
    "l10n": "cent million", 
    "pid": 1, 
    "pos": "num", 
    "pos_txt": "" 
    }, 
    { 
    "cid": 50, 
    "pyn": "yi4", 
    "hans": "億", 
    "hant": "億", 
    "tid": 69, 
    "l10n": "100 millions", 
    "pid": 1, 
    "pos": "num", 
    "pos_txt": "" 
    } 
] 

我怎麼能算陣列(這裏2)中的項目數量,使用Bash或命令行(例如underscore)?

+0

是JavaScript解決方案,您可以接受? – thefourtheye

+0

通過'NPM'模塊是的。否則,不。 –

+0

檢查我的解決方案。這不需要npm。普通的JavaScript。 – thefourtheye

回答

194

就扔在混合另一種解決方案...

嘗試jq,一個輕巧靈活的命令行處理器JSON:

jq '. | length' /tmp/test.json 

打印對象數組的長度。

+1

當我正在查找根數組本身的長度時,您的初始'jq'代碼('。[]')返回根數組中每個'object'的長度。需要修復'。' –

+0

如果你的根不是一個數組,而是一個包含數組的鍵的對象,例如{「key」:[elem1,elem2]},那麼你可以使用'jq'。[] |長度'file.json' – bitek

+3

令人驚歎的工具,'jq'是。 +1 –

7

也許你能跟上awk計數:

$ awk '/{/ {d++} /}/ {d--} /{/ && d==1 {count++} END{print count}' file 
2 
  • /{/ {d++}如果{發現,增加深度變量。
  • /}/ {d--}如果找到},則減少深度變量。
  • /{/ && d==1 {count++}如果深度爲1並且找到{,則在計數器中添加一個匹配項。
  • END{print count}打印結果。
+0

真棒! :向下彎曲: –

+1

注意:這不適用於任意的JSON,也是使用正則表達式解析HTML的另一種情況。 – galva

+0

@galva上面的awk命令可以修改爲接受或拒絕^ nb^n,所以它比正則表達式更強大。 – placeybordeaux

2

一個簡單的解決辦法是安裝jshon庫:

jshon -l < /tmp/test.json 
2 
13

最短的表達是

curl 'http://…' | jq length