首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将文本转换为JSON

将文本转换为JSON
EN

Unix & Linux用户
提问于 2022-01-19 08:19:35
回答 1查看 1.2K关注 0票数 2

输入数据示例(^-delimited字段):

代码语言:javascript
复制
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

我使用以下命令:

代码语言:javascript
复制
 jq -Rn '
    [inputs | select(. != "") / "^"]
    | reduce .[] as [$container, $user, $job] ({};
      .[$job] += [{$user, $container}]
    )
    'test.csv > test.json

我正确地获得了以下JSON输出:

代码语言:javascript
复制
 "Docking AWS\r": [
    {
      "user": "Mark",
      "container": "C-11"
    },
    {
      "user": "Mark",
      "container": "C-12"
    }
  ],

..。但是,我希望这个格式类似于下面的JSON:

代码语言:javascript
复制
Docking AWS
user: Mark
container: C-11,C-12


 "Docking AWS\r": [
    {
      "user": "Mark",
      "container": "C-11","C12"
    },

我怎样才能做到这一点?

++edit++

代码语言:javascript
复制
{
  "job": "Docking AWS",
  "user": "Mark",
  "container": [
    "C-11",
    "C-12"
 ]
}

我想要这种格式如何转换?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2022-01-19 20:05:44

我假设您希望得到如下结果:

代码语言:javascript
复制
{
  "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从原始行的拆分子字符串中构建结果结构来实现:

代码语言:javascript
复制
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创建的对象放入数组中:

代码语言:javascript
复制
jq -Rn '
    reduce ( inputs / "^" ) as [$container,$user,$job] ({}; 
        .[$job] |= ( .job       |=   $job  |
                     .user      |=   $user |
                     .container += [ $container ] )
    ) | [ .[] ]' file

考虑到问题中的数据,这将生成

代码语言:javascript
复制
[
  {
    "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"
    ]
  }
]
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/686966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档