使用bash循环执行循环时会产生冲击,
echo "${KEY}: {\"${ATTRIBUTE}\": ${VALUE} }"
输入第1部分
"PKEY1": {"rank": 1 }
"PKEY2": {"rank": 2 }
"PKEY3": {"rank": 4 }
"PKEY4": {"rank": 3 }
输入第2部分
"PKEY1": {"attr": "xyz" }
"PKEY2": {"attr": "foo" }
"PKEY3": {"attr": "bar" }
"PKEY4": {"attr": "abc" }
输入3、4、5等...
如何获取输出文件或回声,简而言之如下
{
"PKEY1": {"rank": 1, "attr": "xyz" },
"PKEY2": {"rank": 2, "attr": "foo" },
"PKEY3": {"rank": 4, "attr": "bar" },
"PKEY4": {"rank": 3, "attr": "abc" }
}
答案 0 :(得分:2)
您想要的是合并JSON。如果您使用的是1.4+版本,则可以使用:jq -s '.[0] * .[1]' file1 file2
您可以在此处找到更多答案:How to merge 2 json file using jq?
答案 1 :(得分:0)
上述问题可以分为两部分:
1)将key : value
对的文本解析为有效的JSON;
2)构建输出
由于没有明确指定key:value文本的格式,因此我将假定每个key:value对都出现在单独的行上,并且可以使用def:来恢复key / value对。 / p>
def parse:
capture("\"(?<k>[^\"]*)\" *: *(?<v>.*)") | [.k, (.v | fromjson)];
使用以下通用def可以轻松解决问题的第二部分:
def add_by(s; f; g):
reduce s as $x (null; .[$x|f] += ($x|g));
将各个部分放在一起,我们可以编写:
add_by(inputs | parse; .[0]; .[1])
使用merge.jq中的上述代码片段,我们可以编写:
jq -nR -f merge.jq part1.txt part2.txt part3.txt ...
如果您的jq库已经包含:
def aggregate_by(s; f; g):
reduce s as $x (null; .[$x|f] += [$x|g]);
然后您可以按如下方式使用parse
的上述定义:
aggregate_by(inputs | parse; .[0]; .[1])
| map_values(add)