Shell脚本将对数据

时间:2016-06-18 05:50:02

标签: json shell

我需要开发将使用以下数据的shell脚本,并仅对attribute_x_countattribute_y_countattribute_z_count属性求和。我是shell脚本的新手。

您能否提供创建shell脚本所需的步骤 获得这些属性的总和?

{
    "data_type": "dummy",
    "data": {
        "start_time": "2016-05-20",
        "attribute_a": [0, 0, 0, 0],
        "attribute_b": [0.0, 0.0, 0.0, 0.0],
        "attribute_x_count": [0, 0, 1, 1],
        "attribute_y_count": [0, 0, 2, 3],
        "attribute_d": {
            "sub_attribute_p": [0, 0, 0, 0],
            "sub_attribute_q": [0, 0, 0, 0],
            "sub_attribute_r": [0, 0, 0, 0],
            "sub_attribute_s": [0, 0, 0, 0]
        },
        "attribute_e": [0, 0, 0, 0],
        "attribute_f": [0, 0, 0, 0],
        "end_time": "2016-05-21",
        "attribute_z_count": [0, 0, 2, 2],
        "attribute_g": [0, 0, 0, 0],        
        "attribute_i": [0, 0, 0, 0],
        "attribute_j": [0, 0, 0, 0],
        "attribute_k": [0, 0, 0, 0],
        "attribute_i": [3, 0, 0, 0]
    }
}

预期产出: -

  

Sum(attribute_x / y / z_count)= [0,0,1,1] + [0,0,2,3] + [0,0,2,   2]                           = 2 + 5 + 4 = 11

3 个答案:

答案 0 :(得分:1)

数据采用JSON格式,这意味着我们应该使用JSON解析器来处理它。 不,你不应该编写自己的解析器,这很愚蠢。

我正在使用jq,这是一个“Command-line JSON processor”。

在JSON中,如果您有多个具有相同名称的属性(attribute_c_countdata的属性,则会发生三次(如果这是无意的,无论生成什么代码,JSON都有错误, 需要修复)), last 的值是重要的。

因此我们可以提取需要这样总结的数组:

$ jq ".data.attribute_c_count" <indata.json
[
  0,
  0,
  2,
  2
]

这可以通过对其应用add操作来总结:

$ jq ".data.attribute_c_count | add" <indata.json
4

编辑:问题已修改,现在要求对attribute_x_countattribute_y_countattribute_z_count的值求和。

这将提取树阵列:

$ jq ".data.attribute_x_count,.data.attribute_y_count,.data.attribute_z_count" <indata.json
[
  0,
  0,
  1,
  1
]
[
  0,
  0,
  2,
  3
]
[
  0,
  0,
  2,
  2
]

我正在使用add将它们连接成一个数组,然后再次add将它们相加:

$ jq "[.data.attribute_x_count,.data.attribute_y_count,.data.attribute_z_count]|add|add" <indata.json
11

(额外[...]是获取第二个add的数组,否则我只会得到数字(尝试一下))

答案 1 :(得分:0)

如果需要blah.contains("foo|bar")的总和,即[0, 0, 2, 3],则可以使用以下命令,最初需要5属性求和。

attribute_c_count

修改 OP.Edited回答后发布不同的要求。现在需要grep attribute_c_count input.txt|cut -d: -f2|sed -e 's/\[//g' -e 's/\],//g'|tr ',' '\n'|awk '{sum+=$1} END {print sum} 属性sum。

attribute_x_count, attribute_y_count and attribute_z_count

答案 2 :(得分:0)

很抱歉,目前还不是很清楚,您是否希望在总结之前打印所有阵列,或者它是唯一的总值就足够了。

在后一种情况下,使用awk,它可能类似于

gawk -F '[][,]' '/attribute_[xyz]_count/ { for(i = 2; i < NF; ++i) sum += $i }
END { print sum }'