텍스트를 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$jobreduce

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"
    ]
  }
]

관련 정보