입력 데이터 예( ^
-구분된 필드):
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"
]
}
]