2014-01-24 46 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