将文本更改为 JSON

将文本更改为 JSON

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

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$containercontainer

此代码与您的代码之间的主要区别在于,我正在更新结果中的对象,而不是仅仅为每个输入行添加它们。我也将其.[$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"
    ]
  }
]

相关内容