使用jq将过滤器生成的输出与静态JSON对象合并



我正在尝试使用jq来迭代一些分隔的文本文件,并从行中生成对象。

我还想添加一些";静态";对象(以下示例中的jsonshell变量(添加到生成的结果。

我提出了以下解决方案,可以生成我想要的输出。但是,因为我对jq不是很有信心,每次我用它解决问题时,感觉就像猴子在敲打字机,而不是一个精心制作的答案。所以,我认为这可能是不正确的。

data.txt

apple|fruit
Tesla|car
sparrow|bird

测试(bash-shell(:

$ json='[
{ "object": "love", "type": "emotion" },
{ "object": "Ukraine", "type": "country" }
]'
$ jq --slurp --raw-input --argjson extra "$json" '
split("n") |
map(select(length>0)) |
map(split("|") | {
object: .[0],
type: .[1]
}) as $data |
$data + $extra' data.txt

输出:

[
{
"object": "apple",
"type": "fruit"
},
{
"object": "Tesla",
"type": "car"
},
{
"object": "sparrow",
"type": "bird"
},
{
"object": "love",
"type": "emotion"
},
{
"object": "Ukraine",
"type": "country"
}
]

这有效吗?

我不知道它是否更有效,但您可以使用--raw-input-R而不使用--slurp-s来缩短代码,以在原始文本流中对读取进行换行(无需换行(,/运算符可以执行;列";在一行内拆分,并使用reduce来依次构建您的最终结构,从您的";静态";数据

jq -Rn --argjson extra "$json" '
reduce (inputs / "|") as [$object, $type] ($extra; . + [{$object, $type}])
' data.txt

如果你想要";静态";数据,然后添加它,并以一个空数组开始:

jq -Rn --argjson extra "$json" '
reduce (inputs / "|") as [$object, $type] ([]; . + [{$object, $type}]) + $extra
' data.txt

你可以试试这个:

jq -nR --argjson extra "$json" '
[inputs / "|" | {object:.[0], type:.[1]}] + $extra' data.txt
[inputs / "|" | {object: .[0], type: .[1]}]

演示

https://jqplay.org/s/XkDdy9-lBq

reduce (inputs / "|") as [$obj, $typ] ([]; .+[{$obj, $typ}])

演示

https://jqplay.org/s/5N3M-pfJIR