我需要开发将使用以下数据的shell脚本,并仅对attribute_x_count
,attribute_y_count
和attribute_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
答案 0 :(得分:1)
数据采用JSON格式,这意味着我们应该使用JSON解析器来处理它。 不,你不应该编写自己的解析器,这很愚蠢。
我正在使用jq
,这是一个“Command-line JSON processor”。
在JSON中,如果您有多个具有相同名称的属性(attribute_c_count
是data
的属性,则会发生三次(如果这是无意的,无论生成什么代码,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_count
,attribute_y_count
和attribute_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 }'