使用JQ将纯文本块转换为JSON
我有一个格式如下的纯文本文件:使用JQ将纯文本块转换为JSON,json,jq,key-value,Json,Jq,Key Value,我有一个格式如下的纯文本文件: foo: bar color: blue names: joe, john, mary, bob, sue [., inputs] # A | map(split(": ") # B | {(.[0])
foo: bar
color: blue
names: joe, john, mary, bob, sue
[., inputs] # A
| map(split(": ") # B
| {(.[0]): (.[1] | split(", ") | if length > 1 then . else .[0] end )}) # C
| reduce .[] as $x ({}; . + $x) # D
我需要以JSON格式输出此文件的内容:
{
"foo": "bar",
"color": "blue",
"names": ["joe", "john", "mary", "bob", "sue"]
}
我尝试过使用:jq-R-n'[inputs | split:|[{.0:[1]| add'testfile让我们假设文件名为testfile,但我只能得到以下结果:
{
"foo": "bar",
"color": "blue",
"names": "joe, john, mary, bob, sue"
}
要获得所需的输出,我需要做什么?我尝试过管道拆分,在[1]之后,但它会将每个值对放入一个数组中,这是我不想要的。对于-raw输入,您正在寻找类似以下内容:
foo: bar
color: blue
names: joe, john, mary, bob, sue
[., inputs] # A
| map(split(": ") # B
| {(.[0]): (.[1] | split(", ") | if length > 1 then . else .[0] end )}) # C
| reduce .[] as $x ({}; . + $x) # D
其中:
A:将第一行和最后一行组合成一个数组,例如[foo:bar,…]
B:拆分每一行,例如[foo,bar],…]
C:将每个子集转换为一个对象,其中第一个元素是键,第二个元素是值。值按分割,但如果分割后只有一个元素,则将其取出。
D:使用+将每个对象合并为一个,例如{foo:bar}+{color:blue}=>{foo:bar,color:blue,…}
使用-raw输入,您将查找以下内容:
foo: bar
color: blue
names: joe, john, mary, bob, sue
[., inputs] # A
| map(split(": ") # B
| {(.[0]): (.[1] | split(", ") | if length > 1 then . else .[0] end )}) # C
| reduce .[] as $x ({}; . + $x) # D
其中:
A:将第一行和最后一行组合成一个数组,例如[foo:bar,…]
B:拆分每一行,例如[foo,bar],…]
C:将每个子集转换为一个对象,其中第一个元素是键,第二个元素是值。值按分割,但如果分割后只有一个元素,则将其取出。
D:使用+将每个对象合并为一个,例如{foo:bar}+{color:blue}=>{foo:bar,color:blue,…}
始终拆分值。如果结果数组有多个元素,则分配它;否则分配原始字符串 减少投入/:如[$k,$v]。; [$k]=$v/,|如果有1,那么。否则$v结束 或者,检查该值是否先包含分隔符,然后再拆分,如果这样更有意义的话 $v |如果索引,则拆分,否则。结束
请注意,您需要在命令行上使用-R和-n调用JQ,以使其正常工作。始终拆分值。如果生成的数组有多个元素,则分配它;否则分配原始字符串 减少投入/:如[$k,$v]。; [$k]=$v/,|如果有1,那么。否则$v结束 或者,检查该值是否先包含分隔符,然后再拆分,如果这样更有意义的话 $v |如果索引,则拆分,否则。结束 请注意,您需要在命令行上使用-R和-n调用JQ,这样才能工作