如何计算Bash或其他shell中的特定JSON项?

时间:2016-12-08 10:12:44

标签: json bash shell parsing jq

我有以下形式的JSON数据:

{
"home": [{
  "pageid": "about yft",
  "pageData": "0908782"
},

{
  "pageData": "09897"
}]}

如何获取home->pageid项目的总数?

这是我到目前为止所尝试的内容:

$curFileName ={{Path_of_json_file.json}}
appName0=$(cat $curFileName | jq -c '.["home"][]["pageid"]'  | sed 's/"//g');
${#appName0[@]} # to get the length of pageid but didn't success..

但它并没有带来预期的结果。

3 个答案:

答案 0 :(得分:2)

pageid类型的"string"项收集到一个数组中,然后返回数组的长度:

n=$(jq '[.home[].pageid | select(type == "string")] | length' < file.json)

或者,检查home数组中的项目是否有pageid。如果该项具有该属性,请将1放入结果数组中,否则将其置为零。最后使用add函数:

对0和1求和
n=$(jq '[.home[] | if has("pageid") then 1 else 0 end] | add' < file.json)

以下是打印数字的方法:

printf '%d\n' "$n"

示例输出

3

答案 1 :(得分:2)

OP最初给出的输入无效,也没有包含没有.pageid的对象。在此响应中,将使用以下JSON:

{
  "home": [
    {
      "pageid": "about yft",
      "pageData": "0908782"
    },
    {
      "pageData": "09897"
    }
  ]
}

现在考虑这两个过滤器,两者都为上述JSON产生1:

[.home[] | select(has("pageid")) ] | length


[.home[] | .pageid//empty ] | length

如果.home很大,那么更有效的方法如下:

def count(s): reduce s as $i(0; .+1);
count(.home[] | select(has("pageid")))

这是一个高效的单行变体:

reduce (.home[].pageid?//empty) as $x (0; .+1)

计算不同项目的数量

要获取不同 home->pageid项的数量,最简单的方法是使用unique|length而不是length,例如在上面的前两个解决方案中的任何一个。

答案 2 :(得分:-2)

在进行大量搜索后,获得下面给出的最佳结果

echo `cat $curFileName | jq '.["home"][]["pageid"]' | wc -l `

在哪里:

  • $curFileName = {{Path_of_json_file.json}}
  • .["home"][]["pageid"] =目标Json对象

json_file.json:

{
  "home": [
    {
      "pageid": "about yft",
      "pageData": "0908782"
    },
    {
      "pageData": "09897"
    }
  ]
}

了解更多 http://www.compciv.org/recipes/cli/jq-for-parsing-json/