我正在尝试使用jq
来迭代一些分隔的文本文件,并从行中生成对象。
我还想添加一些";静态";对象(以下示例中的json
shell变量(添加到生成的结果。
我提出了以下解决方案,可以生成我想要的输出。但是,因为我对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