새 열의 json에서 csv 변환

새 열의 json에서 csv 변환

아래는 내 JSON 코드입니다

[
{
    "kind": "user",
    "version": "v2",
    "metadata": {
      "name": "person1"
    },
    "spec": {
      "roles": [
        "access",
        "auditor",
        "editor",
        "abc-access"
      ],
      "status": {
        "is_locked": false,
        "locked_time": "0001-01-01T00:00:00Z",
        "lock_expires": "0001-01-01T00:00:00Z",
        "recovery_attempt_lock_expires": "0001-01-01T00:00:00Z"
      },
      "expires": "0001-01-01T00:00:00Z",
      "created_by": {
        "time": "2023-06-07T08:50:58.559675944Z",
        "user": {
          "name": "person2"
        }
      }
    }
  },
  {
    "kind": "user",
    "version": "v2",
    "metadata": {
      "name": "person2"
    },
    "spec": {
      "roles": [
        "access",
        "auditor",
        "editor",
        "abc-access"
      ],
      "status": {
        "is_locked": false,
        "locked_time": "0001-01-01T00:00:00Z",
        "lock_expires": "0001-01-01T00:00:00Z",
        "recovery_attempt_lock_expires": "0001-01-01T00:00:00Z"
      },
      "expires": "0001-01-01T00:00:00Z",
      "created_by": {
        "time": "2023-06-06T14:01:15.256905162Z",
        "user": {
          "name": "person5"
        }
      }
    }
  },
  {
    "kind": "user",
    "version": "v2",
    "metadata": {
      "name": "person3"
    },
    "spec": {
      "roles": [
        "access",
        "auditor",
        "editor",
        "abc-access"
      ],
      "status": {
        "is_locked": false,
        "locked_time": "0001-01-01T00:00:00Z",
        "lock_expires": "0001-01-01T00:00:00Z",
        "recovery_attempt_lock_expires": "0001-01-01T00:00:00Z"
      },
      "expires": "0001-01-01T00:00:00Z",
      "created_by": {
        "time": "2023-06-15T12:16:09.35013254Z",
        "user": {
          "name": "person2"
        }
      }
    }
  },
  {
    "kind": "user",
    "version": "v2",
    "metadata": {
      "name": "person3"
    },
    "spec": {
      "roles": [
        "access",
        "auditor",
        "editor",
        "abc-access"
      ],
      "status": {
        "is_locked": false,
        "locked_time": "0001-01-01T00:00:00Z",
        "lock_expires": "0001-01-01T00:00:00Z",
        "recovery_attempt_lock_expires": "0001-01-01T00:00:00Z"
      },
      "expires": "0001-01-01T00:00:00Z",
      "created_by": {
        "time": "2023-06-06T13:45:30.543520308Z",
        "user": {
          "name": "person6"
        }
      }
    }
  },
  {
    "kind": "user",
    "version": "v2",
    "metadata": {
      "name": "person4"
    },
    "spec": {
      "roles": [
        "access",
        "auditor",
        "editor",
        "abc-access"
      ],
      "status": {
        "is_locked": false,
        "locked_time": "0001-01-01T00:00:00Z",
        "lock_expires": "0001-01-01T00:00:00Z",
        "recovery_attempt_lock_expires": "0001-01-01T00:00:00Z"
      },
      "expires": "0001-01-01T00:00:00Z",
      "created_by": {
        "time": "2023-06-07T04:49:41.39245724Z",
        "user": {
          "name": "person5"
        }
      }
    }
  },
  {
    "kind": "user",
    "version": "v2",
    "metadata": {
      "name": "person5"
    },
    "spec": {
      "roles": [
        "access",
        "auditor",
        "editor",
        "abc-access"
      ],
      "traits": {
        "aws_role_arns": null,
        "db_names": null,
        "db_users": null,
        "kubernetes_groups": null,
        "kubernetes_users": null,
        "logins": [
          "ec2-user",
          "root"
        ],
        "windows_logins": null
      },
      "status": {
        "is_locked": false,
        "locked_time": "0001-01-01T00:00:00Z",
        "lock_expires": "0001-01-01T00:00:00Z",
        "recovery_attempt_lock_expires": "0001-01-01T00:00:00Z"
      },
      "expires": "0001-01-01T00:00:00Z",
      "created_by": {
        "time": "2023-06-06T13:51:39.173360152Z",
        "user": {
          "name": "person6"
        }
      }
    }
  },
  {
    "kind": "user",
    "version": "v2",
    "metadata": {
      "name": "person6"
    },
    "spec": {
      "roles": [
        "access",
        "editor",
        "auditor"
      ],
      "traits": {
        "aws_role_arns": null,
        "azure_identities": null,
        "db_names": null,
        "db_roles": null,
        "db_users": null,
        "gcp_service_accounts": null,
        "kubernetes_groups": null,
        "kubernetes_users": null,
        "logins": [
          "root",
          "ubuntu",
          "ec2-user"
        ],
        "windows_logins": null
      },
      "status": {
        "is_locked": false,
        "locked_time": "0001-01-01T00:00:00Z",
        "lock_expires": "0001-01-01T00:00:00Z",
        "recovery_attempt_lock_expires": "0001-01-01T00:00:00Z"
      },
      "expires": "0001-01-01T00:00:00Z",
      "created_by": {
        "time": "2023-06-06T13:41:41.579010534Z",
        "user": {
          "name": "xyz"
        }
      }
    }
  }
]

csv로 변환해요

jq -r '.[] | [ .metadata.name ] ,  [ .spec.roles[] ] | @csv' ind.json

위 명령의 출력은 다음과 같습니다

"person1"
"alpha","gamma","beta","abc-access"
"person2"
"alpha","gamma","beta","abc-access"
"person3"
"alpha","gamma","beta","abc-access"
"person3"
"alpha","gamma","beta","abc-access"
"person4"
"alpha","gamma","beta","abc-access"
"person5"
"alpha","gamma","beta","abc-access"
"person6"
"alpha","gamma","beta","auditor"

다른 열에 이름과 역할을 지정하고 싶습니다. 이름과 역할이 동일한 행에 있고 공간이 충분하여 Excel에 복사하여 붙여 넣으면 두 개의 열이 되기를 원합니다. 하나는 "이름"을 포함하고 다른 하나는 "역할"을 포함합니다. 큰따옴표 없이 출력을 얻으면 옵션도 찾으십시오.

다음은 예상 출력입니다.

person1    alpha,gamma,beta,abc-access
person2    alpha,gamma,beta,abc-access
person3    alpha,gamma,beta,abc-access
person3    alpha,gamma,beta,abc-access
person4    alpha,gamma,beta,abc-access
person5    alpha,gamma,beta,abc-access
person6    alpha,gamma,beta,auditor

답변1

두 번째 열은 간단한 쉼표로 구분된 문자열 목록인 두 개의 탭으로 구분된 열을 원한다고 가정합니다.

$ jq -r '["name","roles"], map([.metadata.name, (.spec.roles|join(","))])[] | @tsv' file
name    roles
person1 access,auditor,editor,abc-access
person2 access,auditor,editor,abc-access
person3 access,auditor,editor,abc-access
person3 access,auditor,editor,abc-access
person4 access,auditor,editor,abc-access
person5 access,auditor,editor,abc-access
person6 access,editor,auditor

jq표현식은 2요소 배열 세트를 전달하여 @tvs탭으로 구분된 출력 형식으로 지정합니다. 첫 번째 배열은 정적 헤더이고 나머지는 호출에서 나옵니다 map(). 이 map()호출은 구조에서 이름을 추출한 metadata다음 구조의 역할 문자열에서 간단한 쉼표로 구분된 문자열을 생성합니다 spec.

관련 정보