Bash jq;使用主键构建数组

时间:2019-02-06 10:37:13

标签: json bash jq

使用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" }
}

2 个答案:

答案 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 ...

Variant

如果您的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)