输入数据示例(^
-分隔字段):
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"
},
我怎样才能实现这个目标?
++编辑++
{
"job": "Docking AWS",
"user": "Mark",
"container": [
"C-11",
"C-12"
]
}
我想要这个格式怎么转换?
答案1
我假设您想要类似以下的结果:
{
"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 文本文件,因此您可能需要使用 将输入数据转换为 Unix 文本文件dos2unix
,或者使用 手动删除每行末尾的回车符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"
]
}
]