输入数据示例(^-delimited字段):
C-11^Mark^Docking AWS
C-12^Mark^Docking AWS
C-13^Lay^Ploting
C-14^Lay^Ploting
C-15^Lay^Ploting
C-16^Vincent^GPU Calc
C-17^Vincent^GPU Calc
C-18^Vincent^GPU Calc
C-19^Vincent^GPU Calc我使用以下命令:
jq -Rn '
[inputs | select(. != "") / "^"]
| reduce .[] as [$container, $user, $job] ({};
.[$job] += [{$user, $container}]
)
'test.csv > test.json我正确地获得了以下JSON输出:
"Docking AWS\r": [
{
"user": "Mark",
"container": "C-11"
},
{
"user": "Mark",
"container": "C-12"
}
],..。但是,我希望这个格式类似于下面的JSON:
Docking AWS
user: Mark
container: C-11,C-12
"Docking AWS\r": [
{
"user": "Mark",
"container": "C-11","C12"
},我怎样才能做到这一点?
++edit++
{
"job": "Docking AWS",
"user": "Mark",
"container": [
"C-11",
"C-12"
]
}我想要这种格式如何转换?
发布于 2022-01-19 20:05:44
我假设您希望得到如下结果:
{
"Docking AWS": {
"user": "Mark",
"container": [
"C-11",
"C-12"
]
},
"Ploting": {
"user": "Lay",
"container": [
"C-13",
"C-14",
"C-15"
]
},
"GPU Calc": {
"user": "Vincent",
"container": [
"C-16",
"C-17",
"C-18",
"C-19"
]
}
}这可以通过使用reduce从原始行的拆分子字符串中构建结果结构来实现:
jq -Rn '
reduce ( inputs / "^" ) as [$container,$user,$job] ({};
.[$job] |= ( .user |= $user |
.container += [ $container ] )
)' file这使用reduce读取输入,并将其拆分为由三个元素组成的短数组。从空对象开始,通过更新子对象添加新键。$job键引用的子对象通过将user键设置为$user并将$container添加到对象中的数组container来更新。
这与您的代码之间的主要区别是,我正在更新结果中的对象,而不仅仅是为每个输入行添加对象。我还将.[$job].container作为一个数组来处理。
由于您似乎正在处理DOS文本文件,您可能希望使用dos2unix将输入数据转换为Unix文本文件,或者使用jq (将inputs / "^"转换为inputs | rtrimstr("\r") / "^")从每行末尾手动删除回车字符。
修订后的问题,我解释它的方式,要求创建一个顶级的就业数组,而不是把每个任务作为一个关键的顶层对象。这需要调整reduce调用,使其包含一个将$job字符串作为值的job键,然后将reduce创建的对象放入数组中:
jq -Rn '
reduce ( inputs / "^" ) as [$container,$user,$job] ({};
.[$job] |= ( .job |= $job |
.user |= $user |
.container += [ $container ] )
) | [ .[] ]' file考虑到问题中的数据,这将生成
[
{
"job": "Docking AWS",
"user": "Mark",
"container": [
"C-11",
"C-12"
]
},
{
"job": "Ploting",
"user": "Lay",
"container": [
"C-13",
"C-14",
"C-15"
]
},
{
"job": "GPU Calc",
"user": "Vincent",
"container": [
"C-16",
"C-17",
"C-18",
"C-19"
]
}
]https://unix.stackexchange.com/questions/686966
复制相似问题